本文共 3824 字,大约阅读时间需要 12 分钟。
《STM32从零开始学习历程》
USART串口通讯实验篇2——指令控制LED灯实验本实验在《STM32从零开始学习历程》的基础上完成。实验1的理解有助于顺利完成实验2,本着从零开始学习的目的,以下将详细叙述实验过程。
硬件设备:
软件工具:Keil μVision5 v5.33(MDK5)
开发环境:Windows10 Enterprise x64串口助手:X-Com V2.6接口:通过USART1(PB6、PB7引脚)进行通信通过USART串口向STM32发送特定指令,实现对LED灯的控制:
硬件 elek连接
GPIO_ResetBits函数控制输出电平(低电平),实现点亮功能。电路设计图分析
GPIO_SetBits函数将引脚设为低电平以点亮LED。串口初始化
RCC_APB2PeriphClockCmd启用USART1时钟。LED初始化
重定向函数编写
fputc和fgetc函数将C库函数重定向到USART串口,实现串口通信。printf向串口输出信息,scanf从串口读取字符。主程序逻辑
GPIO_ResetBits和GPIO_SetBits控制LED状态。以下是关键代码片段:
1. 串口初始化代码
void uart_init(u32 bound) { // 启用GPIOB和USART1时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 复用USART1功能 GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1); // USB冲突处理 GPIO_Init(GPIOB, (&GPIO_InitStructure)); USART_Init(&USART_InitStructure); USART_Cmd(USART1, ENABLE);} 2. 数据重定向代码
// 往串口发送数据int fputc(int ch, FILE *f) { // 发送字符 USART_SendData(USART1, (uint8_t) ch); // 确保数据发送完毕 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) ; return (ch);}// 从串口读取数据int fgetc(FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) ; return (int) USART_ReceiveData(USART1);} 3. LED初始化代码
void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 启用GPIOF时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); // 配置PF9和PF10为输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOF, &GPIO_InitStructure); // 点亮LED GPIO_SetBits(GPIOF, GPIO_Pin_9 | GPIO_Pin_10);} 4. 主程序逻辑代码
int main(void) { // 延时初始化 delay_init(168); // 串口初始化 uart_init(115200); // LED初始化 LED_Init(); // 显示提示信息 Show_Message(); while(1) { char ch = fgetc(stdin); if (ch != '\0') { switch(ch) { case '1': GPIO_ResetBits(GPIOF, GPIO_Pin_9); break; case '2': GPIO_ResetBits(GPIOF, GPIO_Pin_10); break; case '3': GPIO_ResetBits(GPIOF, GPIO_Pin_9 | GPIO_Pin_10); break; case '4': GPIO_SetBits(GPIOF, GPIO_Pin_9); break; case '5': GPIO_SetBits(GPIOF, GPIO_Pin_10); break; case '6': GPIO_SetBits(GPIOF, GPIO_Pin_9 | GPIO_Pin_10); break; default: Show_Message(); break; } } } // 定义显示提示信息的函数 static void Show_Message(void) { printf("\n 串口通讯控制实验: \n"); printf("指令 ----------- 跑马灯\n"); printf(" 1 ----------- LED1 ON \n"); printf(" 2 ----------- LED2 ON \n"); printf(" 3 ----------- LED1&LED2 ON \n"); printf(" 4 ----------- LED1 OFF \n"); printf(" 5 ----------- LED2 OFF \n"); printf(" 6 ----------- LED1&LED2 OFF \n"); }} 本实验通过izzer功的实验1知识,完成了对LED灯的控制。关键在于对GPIO_ResetBits和_GPIO_SetBits函数的正确使用,以及串口通信的理解。实验完成后,进一步掌握了STM32开发流程和技巧,为后续实验打下了坚实基础。如有疑问,请大家随时提出!
转载地址:http://imwcz.baihongyu.com/