Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7687958
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2014-01-17 16:22:58

SYSTEM 文件夹里面的代码,此文件夹里面的代码由 ALIENTEK 提供,包含了几乎每个实验都可能用到的延时函数,位带操作,串口打印代码等。SYSTEM 文件夹下包含了 delay、 sys、 usart 等三个文件夹。分别包含了 delay.c、 sys.cusart.c 及其头文件 delay.h,sys.h,usart.h。 

delay 文件夹代码介绍

delay 文件夹内包含了 delay.c 和 delay.h 两个文件,这两个文件用来实现系统的延时功能,其中包含 个函数:

void delay_init(u8 SYSCLK); //该函数用来初始化 个重要参数:fac_us 以及 fac_ms;同时把 SysTick 的时钟源选择为外部时钟

void delay_ms(u16 nms); // 该函数用来延时指定的 ms,其参数 nms 为要延时的微秒数

void delay_us(u32 nus);  // 该函数用来延时指定的 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 口进行输入输出读取和控制。 

点击(此处)折叠或打开

  1.    //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,则可以使用 PAout6=1;即可实现。我要判断 PORTA 的第 15个位是否等于 1,则可以使用 ifPAin14==1…;就可以了。

这里顺便说一下,在 sys.h 中的还有个全局宏定义:

//0,不支持 ucos

//1,支持 ucos

#define SYSTEM_SUPPORT_UCOS    0    //定义系统文件夹是否支持 UCOS

SYSTEM_SUPPORT_UCOS,这个宏定义用来定义 SYSTEM 文件夹是否支持 ucos,如果在 ucos 下面使用 SYSTEM 文件夹,那么设置这个值为 即可,否则设置为 0(默认)。

usart 文件夹介绍

usart 文件夹内包含了 usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收。这里只是针对串口 1,比如你要用串口 或者其他的串口,只要对代码稍作修改就可以了。usart.c 里面包含了 个函数一个是 void USART1_IRQHandler(void);另外一个是void uart_init(u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf无法使用,虽然软件编译不会报错,但是硬件上 STM32 是无法启动的,这段代码不要去修改。

printf 函数支持printf 函数向串口发送我们需要的内容,方便开发过程中查看代码执行情况以及一些变量值

uart_init 函数函数是串口 初始化函数。该函数有 个参数为波特率

void  USART1_IRQHandler(void)函数是串口 的中断响应函数,当串口 发生了相应的中断后,就会跳到该函数执行。


阅读(11446) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~