本帖最后由 走投无路的卡卡 于 2018-8-9 09:34 编辑
#include "sys.h"
#include "delay.h"
#define LEIGHT 200
u8 USART_RX_BUF[LEIGHT];
u16 USART_RX_STA=0;
UART_HandleTypeDef UART1_Handler;
u8 aRxBuffer[1];
void usart1_init(u32 bound)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
UART1_Handler.Instance=USART1;
UART1_Handler.Init.BaudRate=bound;
UART1_Handler.Init.Mode=UART_MODE_TX_RX;
UART1_Handler.Init.WordLength=8;
UART1_Handler.Init.StopBits=1;
UART1_Handler.Init.Parity=UART_PARITY_NONE;
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
HAL_UART_Init(&UART1_Handler);
GPIO_InitTypeDef GPIO_Init;
GPIO_Init.Pin=GPIO_PIN_9|GPIO_PIN_10;
GPIO_Init.Mode=GPIO_MODE_AF_PP;
GPIO_Init.Pull=GPIO_PULLUP;
GPIO_Init.Speed=GPIO_SPEED_FAST;
GPIO_Init.Alternate=GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA,&GPIO_Init);
}
int main(void)
{
HAL_Init();
Stm32_Clock_Init(360,25,2,8);
usart1_init(115200);
delay_init(180);
while(1)
{
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(aRxBuffer[0]!=0x0a)
USART_RX_STA=0;
else
USART_RX_STA|=0x8000;
USART_RX_STA=0;
printf("输出:
");
HAL_UART_Transmit(&UART1_Handler,USART_RX_BUF,USART_RX_STA&0X3FFF,1000);
delay_ms(1000);
}
else
{
if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
else
{
HAL_UART_Receive(&UART1_Handler,aRxBuffer,1,1000);
USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
USART_RX_STA++;
if(USART_RX_STA>(LEIGHT-1))USART_RX_STA=0;
}
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
楼主的问题是直接将例程中,串口接收中断的内容直接复制到了主循环中,当然是不可能正常工作的。楼主需要进行的修改是,查看STM32F4系列的参考手册,找到串口1接收完成标志位所在的寄存器,然后在主循环中不断地检测这个位是否被置位,如果被置位则说明串口1收到了一个字节数据,此时再进行例程中串口接收中断的操作,完成后把该标志清空即可。
一周热门 更多>