关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

STM32串口通信配置(USART1+USART2+USART3+UART4)

发布时间:2023-06-30 01:00:32
一、串口一的配置(初始化+中断配置+中断接收函数)   1 /*===============================================================================   2 Copyright:   3 Version:   4 Author:       5 Date: 2017/11/3   6 Description:   7     配置独立看门狗初始化函数,在主函数中运行IWDG_ReloadCounter进行喂狗主函数必须在4s内进行一次喂狗不然系统会复位;   8     函数功能是将接收固定长度的字符串,并将接收后的字符串通过串口发送出去   9 revise Description:  10 ===============================================================================*/  11 #include "stm32f10x_usart.h"  12 #include "stm32f10x.h"  13 #include "stm32f10x_iwdg.h"  14   15 u8 USART1_RX_BUF[21];   16 u8 USART1_RX_CNT=0;  17   18 void IWDG_Configuration(void);   19   20 void Usart1_Init(u32 bound)  21 {  22     //GPIO端口设置  23     GPIO_InitTypeDef GPIO_InitStructure;  24     USART_InitTypeDef USART_InitStructure;  25     NVIC_InitTypeDef NVIC_InitStructure;  26        27     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能USART1,GPIOA,C时钟  28         29     //USART1_TX   GPIOA.9  30     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9  31     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  32     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出  33     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9  34   35     //USART1_RX      GPIOA.10初始化  36     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10  37     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入  38     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10    39   40     //Usart1 NVIC 配置  41     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级   0-3;  42       43     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  44     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3  45     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3  46     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能  47     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器  48     49    //USART 初始化设置  50   51     USART_InitStructure.USART_BaudRate = bound;//串口波特率  52     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式  53     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位  54     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位  55     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制  56     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式  57   58     USART_Init(USART1, &USART_InitStructure); //初始化串口1  59     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断  60     USART_Cmd(USART1, ENABLE);                    //使能串口1   61 }  62 /**  63 * USART1发送len个字节.  64 * buf:发送区首地址  65 * len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)  66 **/  67 void USART1_Send_Data(u8 *buf,u16 len)  68 {  69     u16 t;  70     GPIO_SetBits(GPIOC,GPIO_Pin_9);  71 //  RS485_TX_EN=1;            //设置为发送模式  72     for(t=0;tDR);    //读取接收到的数据     133         UART4_RX_BUF[UART4_RX_CNT&0XFF]=Res;        //回传的数据存入数组,0X3F限制为64个数值 134             UART4_RX_CNT++; 135         USART2_RX_STA=1;     136     } 137      138     if( USART_GetITStatus(UART4, USART_IT_TC) == SET ) 139     { 140         USART_ClearFlag(UART4, USART_FLAG_TC); 141     }     142     //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题 143     if(USART_GetFlagStatus(UART4,USART_FLAG_ORE) == SET) 144     { 145         USART_ReceiveData(UART4); 146         USART_ClearFlag(UART4,USART_FLAG_ORE); 147     } 148 //    USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);//临时关闭接收中断 149     USART_ClearFlag(UART4,USART_IT_RXNE); //一定要清除接收中断 150      151 }  152  153 //初始化延迟函数 154 //SYSTICK的时钟固定为HCLK时钟的1/8 155 //SYSCLK:系统时钟 156 void Systick_delay_init(u8 SYSCLK) 157 { 158     SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8 159 //    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    //选择外部时钟  HCLK/8 160     fac_us=SYSCLK/8;             161     fac_ms=(u16)fac_us*1000; 162 } 163 /*=============================================================================== 164 Author:peter pan 165 Date:  166 Description: 查询式分时或叫做轮询式(近似延时)。本函数是用于执行高效率场合的查询延时,但是一个for or while 循环中只能用一次。 167 revise Description:   168 @ num :    //分时查询的周期计数值     169 @ unit :    //分时查询的周期单位  170     @@ParaValue :  171         MS    //周期单位为MS毫秒级 172         US    //周期单位为US微秒级 173 @ virtual_delay_status :    //静态变量 174     @@ParaValue :  175         SET    //SYSTICK正在占用中,请勿用 176         RESET  //SYSTICK空闲,可以使用 177 @ReValue : 178     with zero mean Time non-arrive ,one representative Time arrived ,you can do task; 179 ##example             if(virtual_delay(1000,MS)) LedFlash();    //1000ms LED闪烁一下 180 ===============================================================================*/ 181 u8 virtual_delay(u32 num,u8 unit) 182 { 183     u32 temp;            184     if(virtual_delay_status==RESET)    //  SYSTICK空闲,可以使用 185       { 186           if(unit==MS) 187           { 188                 SysTick->LOAD=(u32)num*Delay_SYSCLK*125;//时间加载(SysTick->LOAD为24bit) 189                 SysTick->VAL =0x00;           //清空计数器 190                 SysTick->CTRL=0x01 ;          //开始倒数   191           }else if(unit==US)  192           { 193                 SysTick->LOAD=num*Delay_SYSCLK/8; //时间加载                194                 SysTick->VAL=0x00;        //清空计数器 195                 SysTick->CTRL=0x01 ;      //开始倒数      196           } 197           virtual_delay_status=SET; 198           return 0; 199         } 200     else  201         {        //virtual_delay_status==SET SYSTICK被占用 202          203             temp=SysTick->CTRL; 204             if(!(temp&0x01&&!(temp&(1<<16))))//等待时间到达    205             { 206                 SysTick->CTRL=0x00;       //关闭计数器 207                 SysTick->VAL =0X00;       //清空计数器     208                 virtual_delay_status=RESET;     209                 return 1; 210             }else return 0; 211         } 212 }

/template/Home/leiyu/PC/Static