一、同步通信双方时钟一致。
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;