打印
[STM32F1]

stm32 串口中断接受 发送字符串 源码

[复制链接]
1108|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
secretuniverse|  楼主 | 2016-7-7 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
u8 USART1_TX_DAT_MENU1_CMD_BUF1[6]={0x01,0x02,0x03,0x04};
u8 flag=1;
int main(void)
{               
         u8 i=0;
        u8 key_vable=0;
        delay_init();                     //延时函数初始化         
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                  //串口初始化为115200
        lcd_init();
        KEY_init();
        clr_lcd();
        while(1)
        {
           key_vable= KEY_Scan();              //键盘扫描
           if(key_vable==KEY5_SURE)                  //如果key5按下就发送命令
           {
                     send_cmd_to_mainboard(USART1_TX_DAT_MENU1_CMD_BUF1);
                  key_vable=0;
           }
           if((reecive_over_flag==1))
           {
                     clr_lcd();                                     //清屏
                  delay_ms(10);
                     copy_data_to_LCD_dis();          //将接受buf中的数据copy到显示buf中
                     data_dis2();                                  //lcd的显示函数
                  reecive_over_flag=0;              //清零接受完成标志
                  for(i=0;i<4;i++)                          //清零接受数据buf
                  {
                    usart1_r_dat_buf[i]=0;
                        receive_dat[i]=0;                  //清零显示buf
                  }
           }
        }
}

#include "sys.h"
#include "usart.h"

u8 usart1_r_dat_buf[4]={0};
u8 reecive_over_flag=0;           
           
void uart_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
     //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

   //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
        //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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;//收发模式

    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);                    //使能串口

}

void USART1_IRQHandler(void)                                                   //串口1中断服务程序
{
         static unsigned char i=0,j=0;
         if(USART_GetITStatus(USART1, USART_IT_RXNE)==SET)             //接收中断
         {
                 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                 if(i>3)
                 {
                           i=0;
                 }
                usart1_r_dat_buf[i] =USART1->DR;                                          
                i++;
                reecive_over_flag=1;
         }
    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)                 //溢出
     {
         USART_ClearFlag(USART1,USART_FLAG_ORE);                                   //读 SR
         USART_ReceiveData(USART1);                                                                            //读 DR
     }
}
void send_cmd_to_mainboard(u8 *send_cmd_buf)
{
        unsigned char t=0;
           USART_ClearFlag(USART1,USART_FLAG_TC);
        for(t=0;t<4;t++)
        {
                USART_SendData(USART1, send_cmd_buf[t]);                      //向串口2发送数据
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
        }                                                                                          
}
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

55

帖子

1

粉丝