• STM32学习笔记(四)——串口控制LED(中断方式)


    目录:

    一、时钟使能,包括GPIO的时钟和串口的时钟使能

    二、设置引脚复用映射

    三、GPIO的初始化配置,注意要设置为复用模式

    四、串口参数初始化配置

    五、中断分组和中断优先级配置

    六、设置串口中断类型并使能串口中断

    七、编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号)。 

    八、主函数的实现。

    一、时钟使能,包括GPIO的时钟和串口的时钟使能

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	//使能端口时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//使能串口时钟  

    二、设置引脚复用映射

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    	、
    

      

    三、GPIO的初始化配置,注意要设置为复用模式

    	/*GPIO配置*/
        IO_Init.GPIO_Mode = GPIO_Mode_AF;		//配置成复用模式
        IO_Init.GPIO_OType = GPIO_OType_PP;
        IO_Init.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
        IO_Init.GPIO_PuPd = GPIO_PuPd_UP;
        IO_Init.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &IO_Init);
    

      

    四、串口参数初始化配置

    	/*串口初始配置*/
        UT_Init.USART_BaudRate = 9600;		//波特率
        UT_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//无硬件控制流
        UT_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//发送接收
        UT_Init.USART_Parity = USART_Parity_No;			//无奇偶校验
        UT_Init.USART_StopBits = USART_StopBits_1;		//停止位1
        UT_Init.USART_WordLength = USART_WordLength_8b;	//数据位8
        USART_Init(USART1, &UT_Init);
    

      

    五、中断分组和中断优先级配置

        /*中断优先级设置,中断分组*/
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //中断优先级分组2
        NC_Init.NVIC_IRQChannel=USART1_IRQn;        //串口1中断通道
        NC_Init.NVIC_IRQChannelCmd=ENABLE;            //使能中断
        NC_Init.NVIC_IRQChannelPreemptionPriority=0;    //抢占优先级
        NC_Init.NVIC_IRQChannelSubPriority=0;            //响应优先级
        NVIC_Init(&NC_Init);

    六、设置串口中断类型并使能串口中断

        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);        //配置串口中断类型,接收数据中断
        USART_Cmd(USART1, ENABLE);

    七、编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号)

    void USART1_IRQHandler(void)                    //串口1中断服务程序
    {
        u8 Receive_Data = 0;
        if(USART_GetITStatus(USART1, USART_IT_RXNE))    //由于只设置了一种接收中断,判断可以省略
        {
            Receive_Data = USART_ReceiveData(USART1);//保存接收到的数据,RXNE自动清零
            printf("Receive Succsed: %2x 
    ", Receive_Data);//回复接收完成
            if(Receive_Data==0x01)
                LED0=!LED0;
            // USART_ClearFlag(USART1,USART_IT_RXNE);        //手动清零
        }
    }

    由于本程序只使能串口接收到数据(USART_IT_RXNE)产生中断,所以在执行中断服务函数之前可以不用判断,如果使能了多种串口中断,则要先判断产生中断的类型,注意读取数据后,RXNE寄存器自动清零,不需要再手动清零。

    八、主函数的实现,这里仍然采用了LED闪烁和串口发送数据来显示程序运行状态的方法。

    int main(void)
    {
        LED_Init();
        delay_init(168);
        USART1_Config();
        LED0_OFF;
        LED1_OFF;
        while(1)
        {
            LED1=!LED1;
            printf("Running....
    ");
            delay_ms(500);
        }
    }

    以上工作做好后,就可以将程序下载到STM32了, 可以发现LED1在闪烁,同时串口发送来了running.....当电脑发送一个0x01时LED0的状态会反转。

    总结

    本程序只使用了串口接收完成后产生中断,如果我们要让数据发送完成后产生中断,应该如何配置呢?方法是类似的,中断配置时只需要设置为USART_ITConfig(USART1USART_IT_TCENABLE); 同样可以通过函数USART_GetITStatus(USART1, USART_IT_TC) 来判断是否产生发送完成中断。

    参考资料

    关于串口的使用可以参考之前发表的几篇博文:

    1. STM32学习笔记(二)——串口控制LED
    2. STM32学习笔记(三)——外部中断的使用

     以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。

     2017年4月18日21:42:36

     

     

    欢迎大家关注我的个人博客
    微信扫码关注我的公众号

    不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!

  • 相关阅读:
    Fraction to Recurring Decimal
    Compare Version Numbers
    回溯法 -数据结构与算法
    Maximum Gap
    STL——迭代器的概念
    STL——内存基本处理工具
    STL——空间的配置和释放std::alloc(第一级配置器和第二级配置器)
    careercup-中等难度 17.12
    careercup-中等难度 17.11
    careercup-中等难度 17.9
  • 原文地址:https://www.cnblogs.com/whik/p/6730678.html
Copyright © 2020-2023  润新知