首页 > 编程知识 正文

stm32串口通信实验报告心得,uart串口通信实验报告

时间:2023-05-06 20:15:50 阅读:174096 作者:3799

一、同步通信双方时钟一致。

typedef struct { uint 16 _ tus art _ clock; //时钟使能控制uint16_t USART_CPOL; //时钟极性uint16_t USART_CPHA; //时钟相位uint16_t USART_LastBit; //最后一个时钟脉冲(} USART_ClockInitTypeDef; 二、异步通信需要约定通信双方的通信波特率。

voiduart1config(uint32_tbound ) usart _ inittypedefusart _ init structure; //波特率设置usart _ init structure.usart _ baudrate=bound; //字长为8位数据格式usart _ init structure.usart _ word length=usart _ word length _ 8b;//一个停止位usart _ init structure.usart _ stop bits=usart _ stop bits _ 1; //无奇偶校验usart _ init structure.usart _ parity=usart _ parity _ no; //无硬件数据流控制usart _ init structure.usart _ hardware flow control=usart _ hardware flow control _ none; //发送/接收模式usart _ init structure.usart _ mode=usart _ mode _ rx|usart _ mode _ tx; //初始化串行端口1 usart _ init (de gug _ usartx,USART_InitStructure ); (三)启用串行端口voiduart1init(void )//串行时钟RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ usar t1,ENABLE ); //中断服务是nvic _ prioritygroupconfig (nvic _ priority group _0); //嵌套的nvicinit中断(usart1_irqn,0,0 ); //p a9 usart1_ txgpioinit (usar t1 _ tx _ port、USART1_TX_PIN、GPIO_Mode_AF_PP ); //p a10 usart1_ rxgpioinit (usar t1 _ rx _ port、USART1_RX_PIN、GPIO_Mode_IN_FLOATING ); //波特率设定UART1config(115200; usart_cmd(usart1,ENABLE ); //接收中断usart_itconfig(degug_usartx,USART_IT_RXNE,ENABLE ); //发送中断usart_itconfig(degug_usartx,USART_IT_TXE,ENABLE ); (四) VoidNVIcinit(uint8_tIRQchannel,uint8_t IRQC_PTP,uint8_t IRQC_SP )/nvic _ prioritygroupcoupconfig )的结构//中断通道nvic _ init structure.nvic _ IRQ channel=IRQ channel; //抢占优先级nvic _ init structure.nvic _ irqchannelpreemptionpriority=irqc _ PTP; //响应表达式优先级/子优先级nvic _ init structure.nvic _ irqchannelsubpriority=irqc _ sp; //nvic _ init structure.nvic _ irqchannelcmd=启用; nvic_init(nvic_initstructure; (/*外部中断EXTI的各输入线可以单独设定。 类型(与中断或事件)对应的触发事件)上升触发、下降触发或边沿触发(EXTI线路是与EXTI线路0~15对应的外部IO端口的输入中断EXTI线路16输出PVD的EXTI 连接到RTC报警事件EXTI线路18,连接到USB OTG FS唤醒事件EXTI线路19,每个连接到以太网唤醒事件的GPIO端口有16个引脚,每个端口有16个IO //*Function:外部中断*.voidextiinit (uint8_ TGP io _ port,uint8_t GPIO_Pin,uint32_t EXTILine,exdtdhnode //外部中断的端口和

引脚GPIO_EXTILineConfig(GPIO_PORT, GPIO_Pin); EXTI_InitStructure.EXTI_Line =EXTILine; // 中断/事件线 EXTI_InitStructure.EXTI_Mode = Mode; // EXTI 模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger; // EXTI 触发方式 EXTI_InitStructure.EXTI_LineCmd =ENABLE; // 中断线使能或失能EXTI_Init(&EXTI_InitStructure);} 五、GPIO配置 void GPIOInit(uint32_t RCC_APB2Periph,GPIO_TypeDef* GPIOx,uint16_t GPIOPin,uint16_t GPIOMode){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIOPin; GPIO_InitStructure.GPIO_Mode = (GPIOMode_TypeDef)GPIOMode; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOx,&GPIO_InitStructure);}

APB2上的时钟可选:

RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,RCC_APB2Periph_ADC2, RCC_APB2Periph_dtdhn1, RCC_APB2Periph_SPI1,RCC_APB2Periph_dtdhn8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,RCC_APB2Periph_dtdhn15, RCC_APB2Periph_dtdhn16, RCC_APB2Periph_dtdhn17,RCC_APB2Periph_dtdhn9, RCC_APB2Periph_dtdhn10, RCC_APB2Periph_dtdhn11 六、中断服务函数

6.1、方式一

void DEBUG_USART_IRQHandler(void) { uint8_t ucTemp;if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { ucTemp = USART_ReceiveData( USART1); USART_SendData(USART1,ucTemp); } } /***************** 发送一个字符 **********************/void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 发送一个字节数据到 USART */ USART_SendData(USART1,ch);/* 等待发送数据寄存器为空 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); }/***************** 发送字符串 **********************/void Usart_SendString( USART_TypeDef * pUSARTx, char *str){ unsigned int k=0; do {Usart_SendByte( USART1, *(str + k) ); k++; } while (*(str + k)!=''); /* 等待发送完成 */while (USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET) {}}

int main(void) { /*初始化 USART 配置模式为 115200 8-N-1,中断接收*/ USART1Init();/* 发送一个字符串 */Usart_SendString( USART1,"这是一个串口中断接收回显实验n"); while (1) {}}

6.2、方式二

接收状态
//bit15,    接收完成标志
//bit14,    接收到0x0d
//bit13~0,    接收到的有效字节数目
u16 USART1_RX_STA=0;       

void USART1_IRQHandler(void) //串口1中断服务程序{u8 r;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断{r =USART_ReceiveData(USART1);//(USART1->DR);//读取接收到的数据if((USART1_RX_STA&0x8000)==0)//接收未完成{if(USART1_RX_STA&0x4000)//接收到了0x0d{if(r!=0x0a)USART1_RX_STA=0;//接收错误,重新开始else USART1_RX_STA|=0x8000;//接收完成了 }else //还没收到0X0D{if(r==0x0d)USART1_RX_STA|=0x4000;else{USART1_RX_BUF[USART1_RX_STA&0X3FFF]=r;USART1_RX_STA++;if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收 } }} } } int fputc(int ch,FILE*p){// Transmits single data through the USARTx peripheral.// 通过USARTx外围设备传输单个数据。 USART_SendData(USART1,(u8)ch);// Checks whether the specified USART flag is set or not.// 检查是否设置USART指定的标志while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==!RESET);return ch;} void USART1_MAIN_Logic(void){接收到数据if(USART1_RX_STA&0x8000){//得到此次接收到的数据长度 len=USART1_RX_STA&0x3fff;for(t=0;t<len;t++){USART_SendData(USART1, USART1_RX_BUF[t]); //向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}USART1_RX_STA=0;}}

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