×
单片机 > 单片机程序设计 > 详情

STM32学习之串口

发布时间:2020-08-27 发布时间:
|
第一步:把串口用的引脚设置。接收的为GPIO_Mode_IN_FLOATING;   //浮空输入
发送的为GPIO_Mode_AF_PP;  // 复用推挽输出
 
第二部设置 void NVIC_Configuration(void)
 
NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel ; // 全局中断、、 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
  NVIC_Init(&NVIC_InitStructure);
 
 
第三部设置 UART  的时钟,波特率,模式等等
void USART1_Configuration(void)
 { 
USART_InitTypeDef USART_InitStructure; 
USART_ClockInitTypeDef USART_ClockInitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
  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; // 最后一位数据的时钟脉冲不从SCLK输出 
USART_ClockInit(USART1, &USART_ClockInitStructure); // 时钟参数初始化设置
  USART_InitStructure.USART_BaudRate = 115200; // 波特率为:115200 
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据 
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 在帧结尾传输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; // 发送使能+接收使能 
USART_Init(USART1, &USART_InitStructure); USART_ClearFlag(USART1, USART_IT_RXNE); //清中断,以免一启用中断后立即产生中断
 USART_ClearFlag(USART1, USART_IT_TXE);
 USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //使能USART1接收中断源 
//USART_ITConfig(USART1,USART_IT_TXE, ENABLE); //使能USART1发送中断?????????????
//这一句一加上就是一直发送,???????
  USART_Cmd(USART1, ENABLE); //USART1总开关:开启 
 }
 
第四部:串口服务函数
void USART1_IRQHandler(void)
{
 
/* if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET )     //发送
{
USART_ClearFlag(USART1, USART_FLAG_TXE);
USART_ClearITPendingBit(USART1, USART_FLAG_TXE);
 
 
USART_SendData(USART1, 0x02);
}
*/
/* if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)     //接收
{
USART_ClearFlag(USART1, USART_FLAG_RXNE);
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //这两条什么区别
 
USART_SendData(USART1, 0x00);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ; 
}
 */
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
       {
              //将数据回送至超级终端
              USART_SendData(USART1, USART_ReceiveData(USART1));
              //等待数据发送完毕
              while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
       }
}
 
第五步:发送函数
    for( i=0;TxBuf1[i]!='\0';i++)
       {
              USART_SendData(USART1,TxBuf1[i]);
              GPIO_SetBits(GPIOB,GPIO_Pin_5);
              //等待数据发送完毕
              while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
              GPIO_ResetBits(GPIOB,GPIO_Pin_5);
       }



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 TIMER2的使用