首页 > 编程知识 正文

stm32串口5,lm324芯片手册

时间:2023-05-03 13:10:20 阅读:108323 作者:4563

STM32串行寄存器的库函数配置方法1.STM32一般寄存器和库函数2 .串行配置一般步骤(串行实例)1.1 常用的串口相关寄存器:

USART_SR状态寄存器

USART_DR数据寄存器

USART_BRR波特率寄存器

USART_CR1控制寄存器

状态寄存器适用于检测串口此时所处的状态

主要关注RXNE和TC (第5、6位)这两个位置。

RXNE(读数据寄存器非空):该位设置为1时,表示已经接收到数据,可以读取。 即,RDR移位寄存器的数据被传送到USART_DR寄存器。 此时,要做的事情是尽快读取USART_DR,并清除该位。 另外,也可以在该位上写入0,直接清除。

TC(发送完成):该位设置为1时,表示USART_DR中的数据已发送。 如果设置了该位的中断,则会发生中断。 该位也有两种清除方式。 读取USART_SR并写入USART_DR。 在这个比特上直接写0。

USART_DR实际是包含了两个寄存器,一个专门用于发送的TDR,一个专门用于接收的RDR。进行发送数据操作时,往USART_DR写入数据会自动存储在TDR内;当进行读取数据操作时,向USART_DR读取数据会自动提取RDR数据。

串行通信时一位一位传输的,所以TDR和RDR寄存器都是介于系统总线和移位寄存器间的;发送数据时把TDR内容转移到发送移位寄存器上,接收数据时则是把接收到的每一位顺序保存在接收移位寄存器内进而转移到RDR。

波特率寄存器中定义了DIV_Mantissa (整数部分)和DIV_Fraction (小数部分)两个部分。

控制寄存器主要是设置USART使能、检验控制使能、校验选择(奇校验偶校验)、PE中断使能、发送缓冲区空中断使能、发送完成中断使能、接收缓冲区非空使能、发送使能、接受使能、字长等等。

1.2波特率计算

十进制小数直接换算成十六进制需要16,与整数部分16正好相反。

1.3串行操作相关库函数:一个初始化函数

void usart _ init (usart _ typedef * usartx,usart _ init typedef * usart _ init struct ); 作用:串口初始化函数:波特率、数据字长、奇偶校验、硬件流程控制及收发使能

两个使能函数

void usart _ cmd (usart _ typedef * usartx,FunctionalState NewState ); void usart _ it config (usart _ typedef * usartx,uint16_t USART_IT,FunctionalState NewState ); 角色:第一个启用串行端口,第二个启用串行端口相关中断

两个数据收发函数

void usart _ send data (usart _ typedef * usartx,uint16_t Data ); uint 16 _ tus art _ receivedata (usart _ typedef * usartx ); 作用:前者通过串口发送数据,后者从串口接收数据。

四种状态位函数

flagstatususart _ getflagstatus (usart _ typedef * usartx,uint16_t USART_FLAG ); void usart _ clear flag (usart _ typedef * usartx,uint16_t USART_FLAG ); itstatususart _ get it status (usart _ typedef * usartx,uint16_t USART_IT ); void usart _ clearitpendingbit (usart _ typedef * usartx,uint16_t USART_IT ); 作用:前两者是获取(或清除)状态标志的位,最后两者是获取(或清除)中断状态标志的位。

串行端口配置一般步骤2.1步骤1 GPIO时钟使能,串行时钟启用。 调用函数:RCC_APB2PeriphClockCmd ()的一部分;

2串行复位(此步骤不是必需的。 函数调用: USART_DeInit (;

3 GPIO外围设备端口模式设置。 函数调用: GPIO_Init (;

4初始化串行参数。 函数。 USART_Init (;

5打开中断,初始化NVIC。 只有在需要打开中断时,才需要此步骤。

函数调用: NVIC_Init (; USART_ITConfig (;

6启用串行端口。 函数调用: USART_Cmd (;

7编写中断处理函数。 函数: USARTx_IRQHandler (;

8串行数据收发。 函数。 USART_SendData (; 美国航空

T_ReceiveData();

9 串口传输状态获取。调用函数:USART_GetFlagStatus();USART_ClearITPendingBit();

2.2 代码: void My_USART1_Init(void){GPIO_InitTypeDef GPIO_InitStrue;USART_InitTypeDef USART_InitStrue;NVIC_InitTypeDef NVIC_InitStrue;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口端口使能GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStrue);GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStrue);USART_InitStrue.USART_BaudRate=115200;USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_InitStrue.USART_Parity=USART_Parity_No;USART_InitStrue.USART_StopBits=USART_StopBits_1;USART_InitStrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStrue);//USART_Cmd(USART1,ENABLE);//使能串口1USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断,如果不开启,即不用写。NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; //(通道)NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; //(设置开启)NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//(优先级)NVIC_Init(&NVIC_InitStrue);} void USART1_IRQHandler(void){u8 res; //(定义一个变量) if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //(判断是否要执行中断) { res= USART_ReceiveData(USART1); //接受数据 USART_SendData(USART1,res); //发送数据 }} int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);My_USART1_Init(); while(1); } 附 对于串口中断函数(自定义数据接收协议)的理解

正点原子的例程中通过语句USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)开启相关中断,当读数据寄存器非空,即单片机一接收到数据时,便会触发串口1的中断函数。

改协议的核心是定义了一个16位的变量USART_RX_STA,该变量的0-13位用于存储接收到的数据,最后的14、15两位作用在于,当14、15位依次接收到da0x0d和0x0a时,依次将这两位置1,作为判断数据是否接收完的标志位。

void USART1_IRQHandler(void) //串口1中断服务程序{u8 Res; //定义unsigned char型字符Res if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)//这里判断发送接收完成的依据就是串口数据0x0d 0x0a,//0x0d是CR(carriage return)回车的意思,光标回到最左边,//0x0a是LF(line feed)换行的意思,光标到达下一行,//但是在PC上回车和换行是在一起的就是按下回车按键//当然可以更改程序使用其他进行判断例如使用0x2a也就是*进行结束判断{Res =USART_ReceiveData(USART1);//(USART1->DR);//读取接收到的数据,存放到变量Res中if((USART_RX_STA&0x8000)==0)//判断接收是否未完成//接收完成未清除标志位,还是会不断进入到接收中断,所以使用标志进行判断, //当接收完成便不会跳入到判断,从而不执行任何指令,空等待//使用条件判断是否已经接收完数据,这里判断接收完的依据就是收到了0x0a;//具体判断在后面{if(USART_RX_STA&0x4000)//如果接收到了0x0d,那么再进一步执行是否接收到0x0a的判断{if(Res!=0x0a)USART_RX_STA=0;//没有接收到0x0a那么说明,数据未正确传输或者接收错误,重新开始判断,//但是这里没有将接收到的数据进行清空,也没有退出接收中断,此程序只是从头开始执行接收判断else USART_RX_STA|=0x8000;//接收完成了,收到了0x0a那么标志位USART_RX_STA将会变成0x8000,将不再进行数据检测与存储}else //还没收到0X0D,说明数据还未发送结束继续进行数据的检测与存储{if(Res==0x0d)USART_RX_STA|=0x4000;//收到了数据0x0d,标志位USART_RX_STA变成0x4000else{//如果没有接收到数据0x0d,执行判断是否存储数组已满,已满则重新开始接收USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;//将接收到的数据写进数组,标志位USART_RX_STA与上0X3FFF清除前两位以防止标志位与8000和4000冲突USART_RX_STA++;//数组地址加一,向后排if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,超出数组大小,又开始接收向数组重新写 } }} } } 对于main函数的解释: int main(void){ u8 t;u8 len;u16 times=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);//延时初始化 uart_init(115200);//串口初始化波特率为115200LED_Init(); //初始化与LED连接的硬件接口 while(1){if(USART_RX_STA&0x8000){ len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度printf("rn您发送的消息为:rn");while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);for(t=0;t<len;t++){USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}printf("rnrn");//插入换行USART_RX_STA=0;}else{times++;if(times%300==0){printf("rnALIENTEK 探索者STM32开发板 串口实验rn");printf("正点原子@ALIENTEKrnrn");}if(times%200==0)printf("请输入数据,以回车键结束rn"); if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.delay_ms(10); }}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。