delay文件夹代码介绍
delay文件夹内包含了delay.c和delay.h两个文件,这两个文件用来实现系统的延时功能,其中包含3个函数:
voiddelay_init(u8SYSCLK);//该函数用来初始化2个重要参数:fac_us以及fac_ms;同时把SysTick的时钟源选择为外部时钟
voiddelay_ms(u16nms);//该函数用来延时指定的ms,其参数nms为要延时的微秒数
voiddelay_us(u32nus);//该函数用来延时指定的us,其参数nus为要延时的微秒数。
CM3内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
下面我们开始介绍这几个函数。
sys文件夹代码介绍
sys文件夹内包含了sys.c和sys.h两个文件。在sys.h里面定义了STM32的IO口输入读取宏定义和输出宏定义。sys.c里面只定义了一个中断分组函数。
IO口的位操作实现
该部分代码在sys.h文件中,实现对STM32各个IO口的位操作,包括读入和输出。当然在这些函数调用之前,必须先进行IO口时钟的使能和IO口功能定义。此部分仅仅对IO口进行输入输出读取和控制。
//IO 口操作,只对单一的 IO 口!
2.//确保 n 的值小于 16!
3.#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
4.#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
5.#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
6.#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
7.#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
8.#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
9.#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
10.#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
11.#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
12.#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
13.#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
14.#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
15.#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
16.#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n)
有了上面的代码,我们就可以像51/AVR一样操作STM32的IO口了。比如,我要PORTA的第七个IO口输出1,则可以使用PAout(6)=1;即可实现。我要判断PORTA的第15个位是否等于1,则可以使用if(PAin(14)==1)…;就可以了。
这里顺便说一下,在sys.h中的还有个全局宏定义:
//0,不支持ucos
//1,支持ucos
#defineSYSTEM_SUPPORT_UCOS0//定义系统文件夹是否支持UCOS
SYSTEM_SUPPORT_UCOS,这个宏定义用来定义SYSTEM文件夹是否支持ucos,如果在ucos下面使用SYSTEM文件夹,那么设置这个值为1即可,否则设置为0(默认)。
usart文件夹介绍
usart文件夹内包含了usart.c和usart.h两个文件。这两个文件用于串口的初始化和中断接收。这里只是针对串口1,比如你要用串口2或者其他的串口,只要对代码稍作修改就可以了。usart.c里面包含了2个函数一个是voidUSART1_IRQHandler(void);另外一个是voiduart_init(u32bound);里面还有一段对串口printf的支持代码,如果去掉,则会导致printf无法使用,虽然软件编译不会报错,但是硬件上STM32是无法启动的,这段代码不要去修改。
printf函数支持printf函数向串口发送我们需要的内容,方便开发过程中查看代码执行情况以及一些变量值。
uart_init函数函数是串口1初始化函数。该函数有1个参数为波特率
voidUSART1_IRQHandler(void)函数是串口1的中断响应函数,当串口1发生了相应的中断后,就会跳到该函数执行。