一、uasrt
1.基础常识






2.结构体
1) USART_BaudRate:波特率设置。一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV 值, 见公式 20-1 , 并设置USART_BRR 寄存器值。
2) USART_WordLength:数据帧字长,可选8 位或9 位。它设定USART_CR1 寄存器的M 位的值。如果没有使能奇偶校验控制,一般使用8 数据位;如果使能了奇偶校验则一般设置为9 数据位。
3) USART_StopBits:停止位设置,可选0.5 个、1 个、1.5 个和2 个停止位,它设定USART_CR2 寄存器的STOP[1:0]位的值,一般我们选择1 个停止位。
4) USART_Parity : 奇偶校验控制选择, 可选USART_Parity_No( 无校验) 、USART_Parity_Even( 偶校验) 以及USART_Parity_Odd( 奇校验) , 它设定USART_CR1 寄存器的PCE 位和PS 位的值。
5) USART_Mode:USART 模式选择,有USART_Mode_Rx 和USART_Mode_Tx,允许使用逻辑或运算选择两个,它设定USART_CR1 寄存器的RE 位和TE 位。
6) USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,可选有⑴使能RTS、⑵使能CTS、⑶同时使能RTS 和CTS、⑷不使能硬件流。
当使用同步模式时需要配置SCLK 引脚输出脉冲的属性,标准库使用一个时钟初始化结构体USART_ClockInitTypeDef 来设置,因此该结构体内容也只有在同步模式才需要设置。

实验一:USART1 接发通信实验
开发板与电脑通信,在开发板上电时通过USART 发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑。

创建了两个文件:bsp_debug_usart.c 和bsp_debug_usart.h 文件用来存放USART 驱动程序及相关宏定义。
根据表20-3,我们选择usart1,用PA10,PA9作为复用引脚。
- 编程要点
- 使能RX 和TX 引脚GPIO 时钟和USART 时钟;
- 初始化GPIO,并将GPIO 复用到USART 上;
- 配置USART 参数;
- 配置中断控制器并使能USART 接收中断;
- 使能USART;
- 在USART 接收中断服务函数实现数据接收和发送。
配置嵌套向量中断器



发送一个字节完成,TXE置1,发送一串字符串完成,TC置1。接收一个字节,RXNE置1(recieve not empty)
/***************** 发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
/* 发送一个字节数据到USART */
USART_SendData(pUSARTx,ch);
/* 等待发送数据寄存器为空 */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
/***************** 发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
unsigned int k=0;
do
{
Usart_SendByte( pUSARTx, *(str + k) );
k++;
} while (*(str + k)!='\0');
/* 等待发送完成 */
while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET);//字符串的接收就要用到所有字节全部发送完成
2.利用串口发送指令
如果用上面的工程,记得把中断全部注销了!!!中断的优先级比printf()高。
实现的功能是先打印出具体的要求,然后我输入一个字符,根据我的字符单片机做出相应的反应。
取而代之的是用C 语言标准库,fputc 函数是printf 函数内部的一个函数,功能是将字符ch 写入到
文件指针f 所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们
使用USART 函数重新修改fputc 函数内容,达到类似“写入”的功能。
fgetc 函数与fputc 函数非常相似,实现字符读取功能。在使用scanf 函数时需要注意字
符输入格式。
///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(DEBUG_USART, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);
return (ch);
}
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_USART);
}
main函数里面写打印的具体内容和判断字符后的具体操作。
static void Show_Message(void);
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
char ch;
/* 初始化RGB彩灯 */
LED_GPIO_Config();
/* 初始化USART 配置模式为 115200 8-N-1 */
USARTx_Config();
/* 打印指令输入提示信息 */
Show_Message();
while(1)
{
/* 获取字符指令 */
ch=getchar();
printf("接收到字符:%c\n",ch);
/* 根据字符指令控制RGB彩灯颜色 */
switch(ch)
{
case '1':
LED_RED;
break;
case '2':
LED_GREEN;
break;
case '3':
LED_BLUE;
break;
case '4':
LED_YELLOW;
break;
case '5':
LED_PURPLE;
break;
case '6':
LED_CYAN;
break;
case '7':
LED_WHITE;
break;
case '8':
LED_RGBOFF;
break;
default:
/* 如果不是指定指令字符,打印提示信息 */
Show_Message();
break;
}
}
}
/**
* @brief 打印指令输入提示信息
* @param 无
* @retval 无
*/
static void Show_Message(void)
{
printf("\r\n 这是一个通过串口通信指令控制RGB彩灯实验 \n");
printf("使用 USART1 参数为:%d 8-N-1 \n",USARTx_BAUDRATE);
printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n");
printf(" 指令 ------ 彩灯颜色 \n");
printf(" 1 ------ 红 \n");
printf(" 2 ------ 绿 \n");
printf(" 3 ------ 蓝 \n");
printf(" 4 ------ 黄 \n");
printf(" 5 ------ 紫 \n");
printf(" 6 ------ 青 \n");
printf(" 7 ------ 白 \n");
printf(" 8 ------ 灭 \n");
}