4回答

0收藏

STM32的串口配置(中断方式)

STMCU STMCU 5816 人阅读 | 4 人回复 | 2013-04-22

STM32的串口中断配置,也是很简单的.
    首先是配置UART的GPIO口
    首先是配置UART的GPIO口
    /**********************************************
    * Name : UART1_GPIO_Configuration
    * Deion : Configures the uart1 GPIO ports.
    * Input : None
    * Output : None
    * Return : None
    **********************************************************/
    void UART1_GPIO_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    // Configure USART1_Tx as alternate push-pull
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    // Configure USART1_Rx as input floating
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    然后是配置串口参数
    /*******************************************************
    * Name : UART1_Configuration
    * Deion : Configures the uart1
    * Input : None
    * Output : None
    * Return : None
    *********************************************/
    void USART_Configuration(void)
    {
    USART_InitTypeDef USART_InitStructure;
    USART_ClockInitTypeDef USART_ClockInitStructure;
    Uart1_GPIO_Configuration();
    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
    /* Configure the USART1 synchronous paramters */
    USART_ClockInit(USART1, &USART_ClockInitStructure);
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    /* Configure USART1 basic and asynchronous paramters */
    USART_Init(USART1, &USART_InitStructure);
    /* Enable USART1 Receive interrupts */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    /* Enable USART1 */
    USART_Cmd(USART1, ENABLE);
    }
    然后是在中断设置,需要修改stm32f10x_it.c 中的串口中断函数 并且需要修改void NVIC_Configuration(void)函数

    修改NVIC_Configuration函数
    /***********************************************************
    * Name : NVIC_Configuration
    * Deion : Configures NVIC and Vector Table base location.
    * Input : None
    * Output : None
    * Return : None
    ***************************************************/
void NVIC_Configuration(void)
    {
    NVIC_InitTypeDef NVIC_InitStructure;
    #ifdef VECT_TAB_RAM
    /* Set the Vector Table base location at 0x20000000 */
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
    #else /* VECT_TAB_FLASH */
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    #endif
    /* Configure the NVIC Preemption Priority Bits */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    /* Enable the USART1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    }
    //串口中断
    void USART1_IRQHandler(void)
    {
    //处理接收到的数据
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
    /* Clear the USART1 Receive interrupt */
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
    //发送中断
    if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
    {
    USART_SendData(USART1, Send_Data[Send_Length++]);
    if (Send_Length==SEND_LENGTH)
    {
    //发送字节结束
    USART_ClearITPendingBit(USART1,USART_IT_TXE);
    USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);
    }
    }
    //发送完成
    if (USART_GetITStatus(USART1, USART_IT_TC) != RESET)
    {
    USART_ClearITPendingBit(USART1,USART_IT_TC);
    USART_ITConfig(USART1, USART_IT_TC, DISABLE);
    }
    }
    在需要发送的程序里Send_Data[SEND_LENGTH]和发送长度设置好,
    void Send_to_PC(void)
    {
    //设置好Send_Data[SEND_LENGTH]数组
    //打开发送中断
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
    }
    至此 串口就可以工作起来了!~

分享到:
回复

使用道具 举报

回答|共 4 个

倒序浏览

沙发

mcp2013

发表于 2013-4-22 10:50:08 | 只看该作者

{:soso_e100:}                                         
板凳

sacq12

发表于 2013-4-23 08:49:14 | 只看该作者

很好,抽空试一下
地板

franki

发表于 2014-9-19 15:13:29 | 只看该作者

很好    学习啦
5#

奮闘ing

发表于 2014-9-19 16:04:56 | 只看该作者

看看,谢谢了~
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条