STM32 task3学习记录

Posted m0_58834905

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 task3学习记录相关的知识,希望对你有一定的参考价值。

Day3

       由于视频学习太碎片化,而且容易跟不上思路,今天的学习先从读《STM32库开发实战指南》开始

  • 读书随记

1.GPIO被分为GPIOA、GPIOB等不同的组

2.每个端口16个引脚,每个引脚的模式由寄存器的四位控制

3.stm32f10x.h用宏定义的方式实现了地址映射

4.GPIO_TypeDef用typedef关键字声明了GPIO_TypeDef的结构体类型,结构体内定义了七个_IO uint32_t类型的变量

5.时钟系统

       1)高速外部时钟HSE

       2)高速内部时钟HIS

       3)低速外部时钟LSE

       4)低速内部时钟LSI

       二、基于固件库的LED灯

1.配置环境

       需要stm32f10x_gpio.c用于控制io口,stm32f10x_rcc.c配置外设时钟,以及头文件

(取消这两个的注释)

2.初始化结构体GPIO_InitTypeDef

      

3.对GPIO结构体成员赋予控制参数

这样实现了对GPIO的初始化

4.开启外设时钟

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

       所有的GPIO都是挂载到APB2上的

       开启复用时钟ADC1

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

5.控制IO输出高低电平

       这里要用到两个函数 GPIO_SetBits()输出高电平,GPIO_ResetBits()输出低电平。初始先调用GPIO_SetBits()函数让几个引脚输出高电平,使LED处于灭状态

6.续行符“/”

       用于连接上下行代码,在/后面不能有空格、注释等一切杂物

7.写代码    

   [main.c]



#include "stm32f10x.h" 

#include "bsp_led.h"



void Delay(__IO u32 nCount);



int main(void)

{

       /*LED端口初始化*/

       LED_GPIO_Config();

      

       while(1)

       {

              LED1(ON);     //    亮

              Delay(0x0FFFEF);

              LED1(OFF); // 灭

             

              LED2(ON);     //    亮

              Delay(0x0FFFEF);

              LED2(OFF); // 灭

             

              LED3(ON);     //    亮

              Delay(0x0FFFEF);

              LED3(OFF); // 灭         

             

       }

}



void Delay(__IO u32 nCount) //简单的延时函数

{

       for(; nCount !=0;nCount--);

}



       [bsp_led.c]



//板级支持包

#include "bsp_led.h"



void LED_GPIO_Config(void)

{

       /*定义一个GPIO_InitTypeDef类型的结构体*/

       GPIO_InitTypeDef GPIO_InitStructure;

      

       /*开启GPIOC的外设时钟*/

       RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);

      

       /*选择要控制的GPIOC引脚*/

       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;

      

       /*设置引脚模式为推挽输出*/

       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

      

       /*设置引脚速率为50MHz*/

       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

      

       /*调用库函数,初始化GPIOC*/

       GPIO_Init(GPIOC, &GPIO_InitStructure);

      

       /*关闭所有LED*/

       GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);

}



       [bsp_led.h]



#ifndef __LED_H

#define  __LED_H





#include "stm32f10x.h"



/**

   * 定义LED的开关

   * 1是关,0是开

   */

  

#define ON 0

#define OFF 1



//带参宏,可以像内联函数一样使用

#define LED1(a) if(a) \\

       GPIO_SetBits(GPIOC,GPIO_Pin_3);\\

       else \\

       GPIO_ResetBits(GPIOC,GPIO_Pin_3)

      

#define LED2(a) if(a) \\

       GPIO_SetBits(GPIOC,GPIO_Pin_4);\\

       else \\

       GPIO_ResetBits(GPIOC,GPIO_Pin_4)

      

#define LED3(a) if(a) \\

       GPIO_SetBits(GPIOC,GPIO_Pin_5);\\

       else \\

       GPIO_ResetBits(GPIOC,GPIO_Pin_5)

      

void LED_GPIO_Config(void);



#endif /* __LED_H */

       三、寄存器方法编写跑马灯

1.原理图

根据LED硬件图,我们知道了点亮LED0LED1分别要对PB5和PE5这两位进行操作

2.写代码

//打开GPIOB端口的时钟

*(unsigned int *)0x40021018|=((1)<<3);

//配置IO口为输出

*(unsigned int *)0x40010C0C|=((1)<<(4*0)); //【野火版】

或者

【正点原子】

要注意通过“|“”&“操作实现对位的写入,通过<<实现对位移

今日总结:今天是收获颇丰的一天,通过实际写程序串联了前段时间的积累,可谓重见光明。当然,巨大的封装量(库函数)也让我认识到了32的高山比51高太多,要移这座山需要不断地投入才可以。

今天我先看书《库开发指南》然后再看视频,效果很好,因为书可以反复读,视频里一带而过的知识无法形成记忆,书可以很好的弥补这一点。多亏于此我彻底弄明白了GPIOx和CRLCRH等寄存器的作用

今天不知什么原因,写的程序不能点亮LED,我已经重新购买野火原装的仿真器,希望新的仿真器可以成功烧录文件

以上是关于STM32 task3学习记录的主要内容,如果未能解决你的问题,请参考以下文章

STM32学习过程记录9——使用printf

STM32学习过程记录9——使用printf

STM32学习过程记录10——使用STM32CubeMonitor可视化调参

STM32学习过程记录10——使用STM32CubeMonitor可视化调参

STM32学习过程记录10——使用STM32CubeMonitor可视化调参

记录一下 开发STM32 USB HID踩过的坑