另一方面,通过串行端口发送数据(这种数据是指需要输出的汉字、数字等,可以用作书写一个项目的条件和标题) )。
实验现象:将程序中需要输出的值发送到上位机进行显示。
完成步骤:
1 )配置相应串行端口的GPIO端口;
2 )配置对应的串口结构,调用固件库中的单独函数
3 )重写输出stdio.h的printf ) )函数;
4 )在串行头文件中声明配置的GPIO、结构和个别函数;
5 )在main.c中可以直接调用printf ) )函数输出想要输出的数据,一般可以满足所有的输出。
具体步骤如下:
1 )1) ) )。
static void Usart_GPIO_Config ()
{
RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ gpioa,ENABLE );
gpio _ inittypedefgpio _ init struct;
gpio _ init struct.gpio _ pin=gpio _ pin _ 10;
gpio _ init struct.gpio _ speed=gpio _ speed _ 50m Hz;
gpio _ init struct.gpio _ mode=gpio _ mode _ in _ floating;
Gpio_init(gpioa,GPIO_InitStruct );
gpio _ init struct.gpio _ pin=gpio _ pin _ 9;
gpio _ init struct.gpio _ speed=gpio _ speed _ 50m Hz;
gpio _ init struct.gpio _ mode=gpio _ mode _ af _ PP;
Gpio_init(gpioa,GPIO_InitStruct );
}
2 )
static void Usart_ConFig (
{
RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ usar t1,ENABLE );
usart _ inittypedefusart _ init struct;
usart _ init struct.usart _ baudrate=115200;
usart _ hardware flow control=usart _ hardware flow control _ none;
usart _ init struct.usart _ mode=usart _ mode _ rx|usart _ mode _ tx;
usart _ init struct.usart _ parity=usart _ parity _ no;
usart _ init struct.usart _ stop bits=usart _ stop bits _ 1;
usart _ init struct.usart _ word length=usart _ word length _ 8b;
usart_cmd(debug_usartx,ENABLE );
}
3 )3) )。
重定向//c将库函数打印到串行端口。 重定向后可以使用printf函数
intfputc(intch,FILE f ) )。
{
/向串行端口发送1字节数据*
usart_senddata(debug_usartx,(uint8_t ) ch );
/*等待发送完成*
while (usart _ getflagstatus (debug _ usartx,USART_FLAG_TXE )==RESET );
返回(ch );
}
4 )4) ) )。
语音用户(语音)。
{
Usart_GPIO_Config (;
Usart_ConFig (;
}
5 ) ) )。
USART (;
printf (“串行端口printf函数测试n”);
二.使用中断接收信息
实现现象:上位机向单片机发送信息,单片机接收信息,并向上位机反馈信息。
完成步骤:
1 )配置相应串行端口的GPIO端口;
2 )配置对应的串口结构,调用固件库中的单独函数
3 )重写输出stdio.h的printf ) )函数;
4 )设置中断优先级
4 )在串行头文件中声明配置的GPIO、结构和个别函数;
5 )编写中断服务函数
6 )在main.c中调用声明函数。
具体步骤如下:
1 )1) ) )。
static void Usart_GPIO_Config ()
{
RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ gpioa,ENABLE );
gpio _ inittypedefgpio _ init struct;
gpio _ init struct.gpio _ pin=gpio _ pin _ 10;
gpio _ init struct.gpio _ speed=gpio _ speed _ 50m Hz;
gpio _ init struct.gpio _ mode=gpio _ mode _ in _ floating;
GPIO_Init (
GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
2)
static void Usart_ConFig()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=115200;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b ;
USART_Init(DEBUG_USARTx,&USART_InitStruct);
// 串口中断优先级配置
NVIC_Configuration();
// 使能串口接收中断
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
USART_Cmd(DEBUG_USARTx,ENABLE);
}
3)
//重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE f)
{
/ 发送一个字节数据到串口 */
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);
}
4)
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 配置USART为中断源 /
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
/ 抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 子优先级 /
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/ 使能中断 /
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/ 初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);
}
5)
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE)!=RESET)
{
tcmp=USART_ReceiveData(DEBUG_USARTx);
USART_SendData(DEBUG_USARTx, tcmp);
}
USART_ClearITPendingBit(DEBUG_USARTx, USART_IT_RXNE);
}
6)通过返回的值可以做一些功能控制,通过switch()来进行选择。
注:当然也可以不使用中断,直接重新书写getchar()函数,便可以直接接收从上位机发送的数据。(该方法只能以字符的形式输出,不能显示汉字,通过中断便可以显示汉字)
三、使用串口来改变程序中的变量
实现现象:通过串口能成功修改程序中的变量,并将修改后的变量传送回串口显示。
完成步骤:
1) 引入usmart与system组件,添加头文件路径;
2) 在usmart_config.c中添加需要修改变量的函数所在的头文件;
3) 对需要修改变量的函数进行注册;
4) 在main.c中添加两个组件中usmart.h与usart.h头文件;
5) 在main.c函数主函数中进行调用;
具体实现程序如下:
1)
2)
3)
4)
5)