博客
关于我
《STM32从零开始学习历程》——USART串口通讯实验篇2——指令控制LED灯实验
阅读量:485 次
发布时间:2019-03-07

本文共 3824 字,大约阅读时间需要 12 分钟。

《STM32从零开始学习历程》

USART串口通讯实验篇2——指令控制LED灯实验

本实验在《STM32从零开始学习历程》的基础上完成。实验1的理解有助于顺利完成实验2,本着从零开始学习的目的,以下将详细叙述实验过程。


1. 实验准备

硬件设备

  • 开发板:正点原子STM32F4探索者开发板
  • 芯片:STM32F406ZGT6

软件工具:Keil μVision5 v5.33(MDK5)

开发环境:Windows10 Enterprise x64
串口助手:X-Com V2.6
接口:通过USART1(PB6、PB7引脚)进行通信


2. 实现功能

通过USART串口向STM32发送特定指令,实现对LED灯的控制:

  • 发送字符“1”:LED1亮
  • 发送字符“2”:LED2亮
  • 发送字符“3”:LED1和LED2同时亮
  • 发送字符“4”:LED1灭
  • 发送字符“5”:LED2灭
  • 发送字符“6”:LED1和LED2同时灭

3. 硬件设计流程

  • 硬件 elek连接

    • 根据开发板手册,LED灯对应的引脚为PF9(LED1)和PF10(LED2)。
    • 在代码中使用GPIO_ResetBits函数控制输出电平(低电平),实现点亮功能。
  • 电路设计图分析

    • PF9和PF10引脚为高电平时,LED灯熄灭。
    • 需要通过GPIO_SetBits函数将引脚设为低电平以点亮LED。

  • 4. 程序设计流程

  • 串口初始化

    • 使用RCC_APB2PeriphClockCmd启用USART1时钟。
    • 配置GPIO引脚复用功能(PB6和PB7为USART1转发)。
    • 设置串口波特率、字长、停止位等参数。
  • LED初始化

    • 启用GPIOF时钟。
    • 将PF9和PF10引脚设置为普通输出模式,并初始化为低电平(点亮状态)。
  • 重定向函数编写

    • 使用fputcfgetc函数将C库函数重定向到USART串口,实现串口通信。
    • 通过printf向串口输出信息,scanf从串口读取字符。
  • 主程序逻辑

    • 初始化串口和LED。
    • 根据用户输入的指令,通过GPIO_ResetBitsGPIO_SetBits控制LED状态。

  • 5. 代码设计与分析

    以下是关键代码片段:

    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");    }}

    6. 调试与验证

    • 编译项目并下载到开发板。
    • 使用X-Com串口助手,查看串口接收框。
    • 输入“3”并发送,观察LED1和LED2同时亮起。
    • 验证所有指令功能是否正常,确保程序运行稳定。

    7. 总结

    本实验通过izzer功的实验1知识,完成了对LED灯的控制。关键在于对GPIO_ResetBits_GPIO_SetBits函数的正确使用,以及串口通信的理解。实验完成后,进一步掌握了STM32开发流程和技巧,为后续实验打下了坚实基础。如有疑问,请大家随时提出!

    转载地址:http://imwcz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现单链表反转(附完整源码)
    查看>>
    Objective-C实现博福特密码算法(附完整源码)
    查看>>
    Objective-C实现卡尔曼滤波(附完整源码)
    查看>>
    Objective-C实现卡尔曼滤波(附完整源码)
    查看>>
    Objective-C实现卡尔曼滤波(附完整源码)
    查看>>
    Objective-C实现卡恩拓扑algorithm topo算法(附完整源码)
    查看>>
    Objective-C实现卷积(附完整源码)
    查看>>
    Objective-C实现卷积运算(附完整源码)
    查看>>
    Objective-C实现压缩文件夹(附完整源码)
    查看>>
    Objective-C实现原型模式(附完整源码)
    查看>>
    Objective-C实现去掉字符串中指定的字符(附完整源码)
    查看>>
    Objective-C实现去除字符串中的空格(附完整源码)
    查看>>
    Objective-C实现双向A*算法(附完整源码)
    查看>>
    Objective-C实现双向广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现双向循环链表(附完整源码)
    查看>>
    Objective-C实现双向链表(附完整源码)
    查看>>
    Objective-C实现双工通信(附完整源码)
    查看>>
    Objective-C实现双端队列算法(附完整源码)
    查看>>
    Objective-C实现双线性插值(附完整源码)
    查看>>
    Objective-C实现双重链表(附完整源码)
    查看>>