/// 配置USART1接收中断 void USART1_NVIC_Configuration(void) { ?? ?NVIC_InitTypeDef NVIC_InitStructure;? ?? ?/* Configure the NVIC Preemption Priority Bits */ ? ?? ?NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); ?? ? ?? ?/* Enable the USARTy Interrupt */ ?? ?NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;?? ?? ?? ?NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; ?? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; ?? ?NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ?? ?NVIC_Init(&NVIC_InitStructure); }
?/** ? * @brief ?USART1 GPIO 配置,工作模式配置。115200 8-N-1 ? * @param ?无 ? * @retval 无 ? */ void USART1_Config(void) { ?? ?GPIO_InitTypeDef GPIO_InitStructure; ?? ?USART_InitTypeDef USART_InitStructure; ?? ?/* config USART1 clock */ ?? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB, ENABLE); ?? ?//开启端口复用功能 ?? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); ? GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); ?? ?/* USART1 GPIO config */ //?? ?/* Configure USART1 Tx (PA.09) as alternate function push-pull */ //?? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //?? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //?? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //?? ?GPIO_Init(GPIOA, &GPIO_InitStructure); ? ? //?? ?/* Configure USART1 Rx (PA.10) as input floating */ //?? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //?? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //?? ?GPIO_Init(GPIOA, &GPIO_InitStructure); ? ? /* TX PB6 */ ? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; ? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; ? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ? ? GPIO_Init(GPIOB, &GPIO_InitStructure);
? ? /* ?RX PB7 */ ? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; ? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; ? ? GPIO_Init(GPIOB, &GPIO_InitStructure); ?? ?/* USART1 mode config */ ?? ?USART_InitStructure.USART_BaudRate = 115200; ?? ?USART_InitStructure.USART_WordLength = USART_WordLength_8b; ?? ?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); ?? ? ?? ?/* 使能串口1接收中断 */ ?? ?USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); ?? ?USART_Cmd(USART1, ENABLE); ?? ?//配置中断 ?? ?USART1_NVIC_Configuration(); }
/// 重定向c库函数printf到USART1 int fputc(int ch, FILE *f) { ?? ??? ?/* 发送一个字节数据到USART1 */ ?? ??? ?USART_SendData(USART1, (uint8_t) ch); ?? ??? ? ?? ??? ?/* 等待发送完毕 */ ?? ??? ?while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);?? ??? ? ?? ? ?? ??? ?return (ch); }
/// 重定向c库函数scanf到USART1 int fgetc(FILE *f) { ?? ??? ?/* 等待串口1输入数据 */ ?? ??? ?while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
?? ??? ?return (int)USART_ReceiveData(USART1); } void USART1_IRQHandler(void) { ?? ?uint8_t ch; ?? ? ?? ?if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) ?? ?{ ?? ? ?? ? ? ?//ch = USART1->DR; ?? ??? ??? ?ch = USART_ReceiveData(USART1); ?? ? ??? ?printf( "%c", ch ); ? ?//将接受到的数据直接返回打印 ?? ?}? ?? ?? }
|