STM32学习笔记(二)
作者:互联网
1. 核心板电路
电路各部分:
-
单片机最小系统电路:包括单片机,主晶振,起振电容,RC复位电路
-
USB转串口电路(CH340芯片):负责将USB协议信号转换成单片机能处理的USTART串口通信
-
ASP自动下载电路:负责检测串口数据,实现自动下载功能
-
MicroUSB 接口:连接电脑,为核心板提供5V电源输入和串口通信
-
电源电路:为核心板提供5V和3.3V稳定电压
-
功能电路:含有LED、按键、蜂鸣器、RTC走时等附加功能
各元件作用:
-
滤波电容:去除电源电压的波动干扰
-
起振电容:帮助晶体振荡器稳定的工作
-
继电器:核心板的电源总开关
-
RTC晶振:为单片机内部的RTC时钟提供32.768kHz频率的时钟基准
2.点亮LED灯(用库文件)
PS:需要先链接sys.h文件
#include "sys.h"
关于初始化:
LED_Init();
所有I/O端口使用前必须初始化
初始化内容包括:
-
输入还是输出(接口工作模式)
-
端口号(比如:GPIO_PIN_ 1)
-
输出速率(2/10/50MHz)比如:GPIO_Speed_20MHz
-
启动GPIO端口
-
设置IO端口组
GPIO_Init(GPIOB, &GPIO_InitStructure);
即把GPIO_InitStructure结构体里设置的数据赋值给GPIOB端口,然后进行初始化。
方法一:GPIO_WriteBit函数
核心语句:
while(1){ GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)) //LED1端口输出高电平 GPIO_WriteBit(LEDPORT,LED2,(BitAction)(0)) //LED2端口输出低电平 }
这里使用了库函数:GPIO_WriteBit函数
参数1:使用哪一组端口
参数2:使用这一组里的第几号端口
参数3: BitAction是一个枚举变量,在括号中设置的值可赋值给这个枚举变量。
这里参数3也可以直接换成Bit_RESET或者Bit_SET,分别表示清零和置1
详见STM32固件库使用手册P120
方法二:GPIO_ResetBits函数
GPIO_ResetBits(GPIOA,GPIO_Pin_10);
即把GPIOA组的GPIO_Pin_10端口清零
方法三:GPIO_SetBits函数
GPIO_SetBits(GPIOA,GPIO_Pin_11);
即把GPIOA组的GPIO_Pin_11端口置1
方法四:GPIO_Write函数
GPIO_Write(GPIOA,0x0001); //直接把GPIOA这一组的端口变量都赋值为1 GPIO_Write(GPIOB,0x0000); //直接把GPIOB这一组的端口变量都赋值为0
不建议使用这种全部赋值的方法
PS:直接操作寄存器法
需要多层宏定义嵌套,然后最底层的定义变量直接对寄存器地址进行操作。一般板子厂家会提供。
3.LED闪灯程序
主要就是利用延时函数,在开灯和关灯之间加入延时即可看到闪灯效果。
延时函数如下:
delay_us(); //微秒级延时函数,括号里即可填入延时时间 delay_ms(); //毫秒级延时函数,括号里即可填入延时时间
方法一:普通延时法
微秒级延时函数:
void delay_us(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ; }
毫秒级延时函数:
void delay_ms(u16 time) { u16 i=0; while(time--) { i=12000; //自己定义 while(i--) ; } }
即利用for循环,一直倒计时计数,直到为0跳出循环往下执行
优点:比较简单,容易理解与使用
缺点:不是很精准
方法二:SysTick库函数
通过系统的滴答定时器完成,可以精密延时
滴答计时器:本质是倒计时计时器
SysTick库函数详见STM32固件库使用手册P238
第一步:重计数初值
这里涉及到单片机的主频(AHB_INPUT)
主频:指计数为多少时为1ms
比如:主频是72MHz,则计数72次为1ms
#define AHB_INPUT 72 //定义主频 u32 us //定义延时时间长度,即us SysTick->LOAD = AHB_INPUT * us; //即把主频乘以延时时间长度,然后这个值赋值给滴答定时器SysTick里的时间计时器LOAD里
第二步:打开定时器
SysTick->CTRL = 0X00000005;
第三步:等待计数到0
while(!(SysTick->CTRL&0X00010000));
当 SysTick->CTRL 的值不为0时,一直进入while的循环
直到 SysTick->CTRL 的值为0是,才跳出循环,往下执行
第四步:关闭计时器
SysTick->CTRL = 0X00000004;
完整延时函数:
微秒级延时函数:
#define AHB_INPUT 72 void delay_us(u32 us){ //重装计数初值 SysTick->LOAD = AHB_INPUT * us; //打开定时器 SysTick->CTRL = 0X00000005; //等待计数到0 while(!(SysTick->CTRL&0X00010000)); //关闭定时器 SysTick->CTRL = 0X00000004; }
毫秒级延时函数:
void delay_ms(u16 ms){ while(ms-- != 0){ delay_us(1000); //调用1000us的延时 } }
标签:学习,端口,笔记,STM32,while,us,延时,SysTick,GPIO 来源: https://blog.csdn.net/weixin_52324498/article/details/122591314