USART是通用同步/异步串行接收/发送器。大多数通过USB与电脑进行通信,也是比较好的调试方法。当程序出现长时间找不出错误时,可以在相应的变量后面通过串口将数值发送到电脑端,方便对变量的值进行跟踪查看,快速定位出现错误的地方。 USART的初始化函数为 void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //配置USART2 TX引脚工作模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //配置USART2 RX引脚工作模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); //串口2工作模式配置 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(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); } 可以在.\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART\DMA_Interrupt中找到参照 USART发送数据讲解 void USART_SendString(int8_t *str) { uint8_t index = 0; do { USART_SendData(USART2,str[index]); while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET); index++; } while(str[index] != 0); //检查字符串结束标志 } 函数USART_SendData的第一个参数USARTx由初始化函数确定的哪个USART口,一般用USART2。第二个参数Data为一个整数,是需要发送的两字节整数。发送完一个整数或字符后,需要判断该参数是否发送成功。函数USART_GetFlagStatus的第一个参数USART2就是确定是判断哪个USART口。第二个参数是根据整体的代码功能确定,如果是判断USART的发送是否成功的话,可以用IS_USART_FLAG;如果是判断USART的接收是否成功的话,可以用USART_FLAG_RXNE。其所有的取值可以根据函数IS_USART_FLAG的定义位置查看。 当判断出函数的某一个字符为数值0时,表明数组的每一个元素发送完毕。最后需要注意的是,发送函数的参数int8_t *str为数组的指针(首地址)。 因为USART的数据接收是不定时的,所以需要利用中断进行实时的监控。中断的设置代码如下 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the RTC Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 下面对中断函数的内容进行编写。中断函数都放在stm32f10x_it.c中,正确的配置代码如下 void USART2_IRQHandler(void) { uint8_t temp; if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET){ USART_ClearITPendingBit(USART2,USART_IT_RXNE); temp = USART_ReceiveData(USART2); if((temp == 'x') || (RXCUNT == 20)){ RXCUNT = 0; RXOVER = 1; //接收完成标志位置位 USART_ITConfig(USART2,USART_IT_RXNE,DISABLE); } else{ USART_RXBUF[RXCUNT] = temp; ++RXCUNT; } } } 在stm32f10x_it.c文件中声明、定义了一些全局变量: extern uint8_t USART_RXBUF[20]; //接收缓冲区 uint8_t RXOVER = 0; //接收完成标志位 uint8_t RXCUNT = 0; //字符个数控制 在调用函数或main.c文件中对这些变量的声明、定义是 uint8_t USART_RXBUF[20]; extern uint8_t RXOVER; LCD是液晶显示器,可以显示字符(包括汉字)、图片等,是嵌入式比较常用的模块,也是比赛必考的模块。因为LCD的功能很强大,所以LCD包含的函数也是非常多的。不过蓝桥杯嵌入式对LCD的考核降低了很多,所用到的函数不多,而且也不用自己编写任何有关的函数,只需能够熟练的调用常用的函数即可。接下来只介绍常用函数的功能及注意事项。 LCD初始化函数(比赛给的例程中有)STM3210B_LCD_Init(); LCD字符显示的颜色选择 LCD_SetTextColor(); 其中参数可以为White、Black、Grey、Blue、Blue2、Red、Magenta、Green、Cyan、Yellow。定义在lcd.h中的第135行。 LCD背景颜色选择 LCD_SetBackColor(); 参数同上。 LCD清屏颜色选择 LCD_Clear(); 参数同上。 LCD字符串显示 LCD_DisplayStringLine(u8 Line, u8 *ptr); 第一个参数是选择行数,及在哪一行进行显示,第二个参数为显示的内容(以字符串表示)。 例:LCD_DisplayStringLine(Line4,"+ LCD_ASCII DEMO +"); 在第四行显示+ LCD_ASCII DEMO +。 第一个参数的全部取值为Line0、Line1、Line2、Line3、Line4、Line5、Line6、Line7、Line8、Line9。第二个参数为任意字符串,但是不能太长,不能显示变量的值,否则不能正常显示。 LCD清除某一行的内容 LCD_ClearLine(u8 Line); 参数的全部取值为Line0、Line1、Line2、Line3、Line4、Line5、Line6、Line7、Line8、Line9。将该行的内容全部清除,背景颜色为离刚执行最近的背景颜色选择函数。 7、用LCD显示变量的值 可以用sprintf函数将要显示的变量的值和字符串等组合在一起存放到某一连续的内存中,并设置其首地址的名字。 例:sprintf((char *)string,"%s%.3f","ADC Value:",a); LCD_DisplayStringLine(Line7,string); %s与后面ADC Value:的相对应,也可以将%s替换为ADC Value:。%.3f与后面a的的值相对应。保留小数点后3位,且a为实型。若要显示整型变量的值可以将%.3f替换为%d,加.3会占用几个字符位置。与C语言的显示函数printf类似。首地址的名字要进行强制转换,使其符合函数形参的要求。首地址的名字要进行相应的定义,如: uint8_t string[20];
|