五、串口调试 本次是以串口发送发送数据和接收数据为例来进行简单调试,具体以打印版本号和打印向串口发送的数据为例: 一、设置外部时钟 1、设置外部晶振: 我用的是12M的晶振所以设为12MHZ 2、设置单片机工作频率: #ifdefined (STM32F10X_LD_VL)|| (defined STM32F10X_MD_VL)|| (defined STM32F10X_HD_VL) /*#define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000 #else /*#define SYSCLK_FREQ_HSE HSE_VALUE */ /*#define SYSCLK_FREQ_24MHz 24000000 */ /*#define SYSCLK_FREQ_36MHz 36000000 */ /*#define SYSCLK_FREQ_48MHz 48000000 */ /*#define SYSCLK_FREQ_56MHz 56000000 */ #define SYSCLK_FREQ_72MHz 72000000 #endif 二、设置串口 caseSTM_UART1: { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE); /* Configure USART Tx as alternatefunction 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); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); break; } 三、初始化串口 Uart_SetGpio(uartNum); // 管脚设置 Uart_NVICConfig(uartNum); // 中断配置 initValue.USART_BaudRate = baud; // 设置波特率 initValue.USART_WordLength= USART_WordLength_8b; //数据位 initValue.USART_StopBits = USART_StopBits_1; // 停止位 initValue.USART_Parity = USART_Parity_No; // 奇偶位 initValue.USART_HardwareFlowControl= USART_HardwareFlowControl_None; // 硬件流控制 initValue.USART_Mode= USART_Mode_Rx | USART_Mode_Tx; //串口模式 USART_Init(STM_Uart[uartNum],&initValue); // 初始化串口 USART_ITConfig(STM_Uart[uartNum],USART_IT_RXNE, ENABLE); // 接收中断 USART_Cmd(STM_Uart[uartNum],ENABLE); // EnableUSART USART_ClearFlag(STM_Uart[uartNum],USART_FLAG_TC); // 清标志 四、中断配置 STM_UART1: NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0; 六、设置波特率: voidAppInit(void) { SystemInit(); // 设置配置 SystemCoreClockUpdate(); // 更新内核时钟 //NVIC_SetVectorTable(DC_BOOT_SADDR,DC_BOOT_SIZE); // 中断向量重映射 SysTickInit(10); // 节拍时钟 UartInit(STM_UART1,115200); //IWDTInit(); // 独立看门狗 /* 这里添加硬件初始化 */ } 五、修改中断服务函数 voidUSART1_IRQHandler(void) { u8 dat; if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)!=RESET) // 添加次句,防止串口一直进入此中断 { USART_ReceiveData(USART1); } if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) // 串口接收 { /* Read one byte from the receive dataregister */ dat = USART_ReceiveData(USART1); RDTWriteByte(&AppUart1,dat); } } 六、读写函数 1、从接受缓冲中读取多字节数据: void RDTReadNByte(RDT_PAR *pRcv,u8 *pBuf, u16 len) { for (u16 i=0; i { *(pBuf+i) =pRcv->RwBuf[pRcv->RdCnt]; if (++(pRcv->RdCnt) >=pRcv->BufLen) { pRcv->RdCnt = 0; // 清零 } } } 2、发送多字节数据 void UartSendMultByte(u8 uartNum,u8 *pStr, u16 len) { while (len--) { USART_SendData(STM_Uart[uartNum],*pStr++); // 发送数据 while(USART_GetFlagStatus(STM_Uart[uartNum], USART_FLAG_TC) == RESET) // 获取串口状态 { ; } } } 3、获取缓冲区中未读数据长度 u16 RDTGetLen(RDT_PAR *pRcv) { return ((pRcv->WtCnt >= pRcv->RdCnt) ? ((pRcv->WtCnt -pRcv->RdCnt)) : ((pRcv->WtCnt + pRcv->BufLen)- pRcv->RdCnt)); } 七、简单打印版本信息: 1、先定义版本信息: APP_VER AppVerInfo = { "HWV_V1.00\r\n" // 硬件版本 "SWV_V1.00\r\n" // 软件版本 "2013-05-07\r\n" // 时间 }; 调用版本打印函数: void App_PrintVersion(void) { UartSendStr(STM_UART1, AppVerInfo.Hardware); UartSendStr(STM_UART1, AppVerInfo.Software); UartSendStr(STM_UART1, AppVerInfo.CmpTim); } 这里是将打印应函数放在初始化中的,运行后刚开始在串口工具窗口会看到打印出的数据,只打印一次 八、接收数据后打印 1、先定义一个存放数据的数组: u8 App_Uart1[ APP_UART_SIZE ] = {0}; RDT_PAR AppUart1 = {0, 0, APP_UART_SIZE, App_Uart1}; 2、定时执行下面的函数,用来查询是否接收到数据,如果接收到就从串口输出: void Task_1(void) { u8 temp[100] = { 0 } ; u16 uart_len = 0; uart_len = RDTGetLen( &AppUart1); //获取缓存中数据长度 if(uart_len > 0 ) //如果有数据 { RDTReadNByte( &AppUart1, temp, uart_len ); //读取多个字节 UartSendMultByte( STM_UART1, temp, uart_len); //发送到串口1 } } 运行后用串口工具发送任何数据都会被接收并返回发送到串口工具的窗口。
|