前言:
- STM32的IO口标注FT的兼容5V,即接收到5V信号 也能识别
- STM32启动模式 BOOT1、BOOT0(选择启动的程序来源,FLASH中代码&SRAM中代码)
- 添加文件须 包含文件路径
- RCC时钟初始化
- 端口复用 :可用作通用IO口 也可复用为外设引脚 default(默认)
- 端口映射 :方便PCB布线 remap(重映射)
- 使用所有外设。都需要先使能相应时钟
1、模拟输入:专用于ADC通道的输入,输入信号为模拟信号。
2、浮空输入:输入信号为数字信号。数字信号直接跳过上下拉电阻,直接输入到IO逻辑电路。
3、下拉输入:输入信号为数字信号。由弱下拉电阻保持该引脚的电平为低电平。
4、上拉输入:输入信号为数字信号。
5、推挽输出:输出信号为数字信号。不仅能输出高低电平的信号,还有驱动电流的能力
6、开漏输出:输出信号为数字信号。不能驱动元器件,只是输出给外部一个1/0的高低电平信号。
7、复用推挽输出/复用开漏输出:在复用模式下使用,使用方法和上面一样。
一、跑马灯
1.使能IO口时钟。调用函数RCC_APB2PeriphColckCmd();
不同的IO组,调用的时钟使能函数不一样。
2.初始化IO口模式。调用函数GPIO_Init();
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
//使能PB、PE时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB.5端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHZ
GPIO_Init(GPIOB, &GPIO_InitStructure); //对PB.5进行初始化
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PE.5端口配置
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
3.操作IO口,输出高低电平。 GPIO_SetBits(); GPIO_ResetBits();
位操作 : 把一个比特膨胀为32位的字(每个比特对应一个地址)
二、蜂鸣器
- IO直接连接蜂鸣器,IO输出电流小 驱动能力弱 ,无法带动蜂鸣器
1. 使能IO口时钟。调用函数RCC_APB2PeriphColckCmd();
2.初始化IO口模式。调用函数BEEP_Init();
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB.8端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度设置为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数初始化GPIOB.8
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//输出为0,关闭蜂鸣器
}
3.操作IO口,输出高低电平。
三、案件输出
1.使能按键对应IO口时钟。调用函数: RCC_APB2PeriphClockCmd();
2.初始化IO模式:上拉/下拉输入。调用函数:GPIO_Init();
void KEY_Init(void) //IO口按键初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
//使能PORTA、PORTE时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置上拉输出
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3.扫描IO口电平(库函数/寄存器/位操作)。
四、时钟系统
启动文件中定义 先启动systeminit 然后调用main函数
五、滴答计时器
- systick定时器,常用做延时或者实时系统的心跳信号
- 一个24位的定时器,计到0,将从RELOAD寄存器中 自动重新装载定时初值
六、中断管理办法
系统代码执行过程中,仅设置一次中断优先级分组(避免中断混乱)
中断分为0~4组
每个中断设置 一个抢占优先级+一个相应优先级
七、串口通信
处理器与外部的通信方式
- 并行通信 :数据各个位同时传输
- 串行通信 :数据按位顺序传输
数据传输方向
- 单工 :数据单向传输
- 半双工 :数据双向传输(不能同时)
- 全双工:数据能同时双向传输
时钟信号
- 同步通信 :带时钟同步信号传输 - SPI 、IIC
- 异步通信 : 不带时钟同步信号 - UART(通用异步收发器)、单总线(需约定波特率)
PS :UART - 通用异步收发器
USART - 通用同步异步收发器
串口异步通信参数:
- 起始位
- 数据位
- 奇偶校验位
- 停止位
- 波特率设置
串口配置
1.串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
2.串口复位:USART_DeInit(); 这一步不是必须的
3.GPIO端口模式设置:GPIO_Init(); 串口参数初始化:
4.USART_Init();
5.开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init(); USART_ITConfig();
6.使能串口:USART_Cmd();
7.编写中断处理函数:USARTx_IRQHandler();
8.串口数据收发: void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
9.串口传输状态获取: FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
八
九