SYSTEM 文件夹里面的代码,此文件夹里面的代码由 ALIENTEK 提供,包含了几乎每个实验都可能用到的延时函数,位带操作,串口打印代码等。SYSTEM 文件夹下包含了 delay、 sys、 usart 等三个文件夹。分别包含了 delay.c、 sys.c、usart.c 及其头文件 delay.h,sys.h,usart.h。
delay 文件夹代码介绍
delay 文件夹内包含了 delay.c 和 delay.h 两个文件,这两个文件用来实现系统的延时功能,其中包含 3 个函数:
void delay_init(u8 SYSCLK); //该函数用来初始化 2 个重要参数: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 口进行输入输出读取和控制。
//IO 口操作,只对单一的 IO 口!
//确保 n 的值小于 16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#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
#define SYSTEM_SUPPORT_UCOS 0 //定义系统文件夹是否支持 UCOS
SYSTEM_SUPPORT_UCOS,这个宏定义用来定义 SYSTEM 文件夹是否支持 ucos,如果在 ucos 下面使用 SYSTEM 文件夹,那么设置这个值为 1 即可,否则设置为 0(默认)。
usart 文件夹介绍
usart 文件夹内包含了 usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中断接收。这里只是针对串口 1,比如你要用串口 2 或者其他的串口,只要对代码稍作修改就可以了。usart.c 里面包含了 2 个函数一个是 void USART1_IRQHandler(void);另外一个是void uart_init(u32 bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf无法使用,虽然软件编译不会报错,但是硬件上 STM32 是无法启动的,这段代码不要去修改。
printf 函数支持printf 函数向串口发送我们需要的内容,方便开发过程中查看代码执行情况以及一些变量值。
uart_init 函数函数是串口 1 初始化函数。该函数有 1 个参数为波特率
void USART1_IRQHandler(void)函数是串口 1 的中断响应函数,当串口 1 发生了相应的中断后,就会跳到该函数执行。
上一篇:STM32 波形
下一篇:STM32 通用定时器
推荐阅读最新更新时间:2024-11-13 07:17
设计资源 培训 开发板 精华推荐
- LTC3882IUJ-1 具有分立栅极驱动器的 36V 输入、3.3V/40A、1MHz 降压转换器的典型应用电路
- LTC3713、1.8V、10A 降压转换器 (300kHz)
- MLX90640热成像仪
- 使用 MaxLinear, Inc 的 SPX2920 的参考设计
- 使用符合 EN50121-3-2(双输出)具有 EMC 滤波的 RP40-2412SFR DC/DC 转换器的典型应用
- CBM2199 open source -UD
- LTC1687、52 Mbps 精密延迟 RS485 故障安全收发器的典型应用电路
- 18650锂电池充电宝
- 使用 NXP Semiconductors 的 MKV10Z32VLF7 的参考设计
- OM15080-QN9090: 面向QN9090/30的BLE USB dongle
- TI 工业月,灵感不设限!深度挖掘工业设计的痛点和难点,读专题填问卷赢好礼!
- 2017 EEWORLD爆款直播回放云集,写评论抢楼赢礼!
- 泰克任意波形发生器,跨越成本极限,克服挑战
- 示波器可以帮你解决的典型应用
- 有奖直播预报名|与英飞凌一同探寻网络摄像机的黑科技
- 2017年恩智浦物联网设计大赛
- 注册泰克MDO示波器礼券 拿蓝牙耳机和纤细激光笔!
- 从终端到架构,TE Connectivity(TE)助你连接5G高速未来 看视频答题赢好礼!
- 拆招有礼:洞悉电子产品中的大数据,招招解决测量难题!Keysight DAQ970系列活动
- 您的电路保护有足够的空间吗?Littelfuse的881系列保险丝迎接这一挑战