一、gpio 配置
1、按键:上拉输入
2、点亮灯泡:不上不下,推挽输出
PB13、PB14对应按键
PC13、PC14对应灯泡,低电平点亮。
//使能时钟
rcu_periph_clock_enable(RCU_GPIOC);
//使能时钟
rcu_periph_clock_enable(RCU_GPIOB);
//设置输出模式,不上下拉
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
//设置输出模式,上拉
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
//设置输出类型,推挽输出,50Mhz
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
3、代码说明
按下KEY1,板载LED灯点亮,按下KEY2,板载LED灯熄灭。
此处项目源码中,有一个小细节,当我们检测按键是低电平时,开始延迟10ms进行消抖,随后再次判断,如果还是低电平,那就确定是按键按下,但还会有另外一个问题出现,如果我们一直按着按键,那就会一直是低电平,就会造成反复判断。
所以,加入一个死循环,如果按键一直按下,就一直循环,当按下松手的时候,才算一次完整的按键按下。
二、串口通信
1、 串口通信参数介绍
- 波特率: 衡量通信速度的参数,它表示每秒钟传送的bit的个数。
- 数据位: 衡量通信中实际数据位的参数,表示一个信息包里包含的数据位的个数。
- 停止位: 用于表示单个信息包的最后位,典型值为1、1.5和2位。由于数据是在传输线上传输的,每个设备都有自己的时钟,很有可能在通信过程中出现不同步,停止位不仅仅表示传输的结束,还能提供校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也越慢。
- 奇偶检验位: 表示一种简单的检查错误的方式。
2、串口工作模式
串口可以工作在单工、半双工和全双工模式下。
- 单工:在通信的任意时刻,信息只能由A传到B。
- 半双工:在通信的任意时刻,信息即可由A传到B,又能由B传到A,但同时只能有一个方向上的传输存在。
- 全双工:在通信的任意时刻,通信线路上存在A到B和B到A的双向信号传输。
3、串口通信协议
串口在进行通信的时候会按照数据包的形式进行发送,帧格式如下所示。
串口通信是一位一位地传输,每传输一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平),后面由7位数据位组成,接着是一位校验位,最后是停止位。停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。
4、串口接口原理图
在开发板上默认使用的串口是串口0,有两根数据线,也就是USART0_TX和USART0_RX。串口引脚和下载引脚连接在Type-C,插上Type-C就可以进行串口调试。关于串口原理图如下所示。
GPIO引脚默认是作为普通IO使用,当需要使用外设功能时,需要打开对应的复用模式。
//使能时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
//复用功能设置
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
//端口模式设置,tx可以使用推挽输出
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
//端口模式设置
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
usart_word_length_set(USART0, USART_WL_8BIT); //8位数据位宽
usart_stop_bit_set(USART0, USART_STB_1BIT); //1位停止位
usart_parity_config(USART0, USART_PM_NONE); //无校验位
usart_baudrate_set(USART0, bound); //波特率
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); //发送使能
//使能串口0
usart_enable(USART0)
5、串口发送数据
配置好串口参数后,下一步操作就是要发送数据。
发送数据的流程分三步走:
第一步:调用串口发送函数;
第二步:等待串口发送完成;
第三步:清除串口发送标志位;
void USART0_SendData(char sendData)
{
//串口发送函数,发送一个字节数据
usart_data_transmit(USART0, (uint8_t)sendData);
//等待串口发送完成
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
//清除串口发送标志位
usart_flag_clear(USART0,USART_FLAG_TC);
}