本帖最后由 lygo 于 2017-9-14 00:03 编辑
既然定时器学习的差不多了,还有就是输入捕获了。输入捕获就让大家去完成了,在这里我也就不写了,嘿嘿。输入捕获可以测量频率,占空比以及电机编码器的值(脉冲数的值),也比较好玩的。好的,那么就进入正题吧,这次就进入到串口的学习,那么先先学习简单的吧,printf打印数据输出到串口显示,还有利用scanf实现从串口输入数据然后数据又通过printf打印出来。
注意:板载的虚拟串口是usart2(所以下面的配置是针对串口2进行配置的),所以可直接用串口2打印数据,什么是虚拟串口。什么是虚拟串口?虚拟串口也是要靠硬件来实现的,现在市场上有很多协议转换类的产品。比如:USB转串口,网口转串口,光纤转串口等设备。通过厂家自带的软件,可以把PC之外的接口虚拟到你的PC上,成为你计算机的一个COM口,你可以把这个串口打开使用,像你PC上的 COM口一样去用。
那么下面就开始配置串口吧:
(1)、新建工程就不用说了吧,前面都说的十分清楚地,如果还不清楚话,可以去看前面我的帖子。
(2)、选择串口2且设置为一步通信方式,PA2设置发送引脚,PA3设置为接收引脚。如下图:
(3)、时钟配置,选择内部高速时钟(HSI),如下图:
(4)、串口配置相关参数:
串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。如下如图:
C语言中的标准库中所用的标准输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:重定向是指用户可以自己重写C 的库函数,当连接器检查到用户编写了与C 库函数相同名字的函数时,优先采用用户编写的函数,这样用户就可以实现对库的修改了。为了实现重定向printf()和scanf() 函数,我们需要分别重写fputc()和fgetc() 这两个C 标准库函数,代码如下:
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart2,&ch, 1, 0xffff);
return ch;
}
注意这里用的是轮询的方式,谈到串口这里不得不说串口的三种通信模式:
第一种是上面用到的轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
(5)、编写用户代码:
在uart.c写上上面代码即可,主函数代码如下:
int main(void)
{
char data;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
printf("云汉lygo....\r\n");
while (1)
{
if(scanf("%s",data) == 1)//表示输入类型与%s相同,其实不要也行
{
printf("data:%s\r\n",data);
break;
}
}
(6)、串口打印图:
下一篇就是用DMA来接收并处理不定长数据了,好的谢谢大家!!!
本次实验文档如下:
本帖最后由 lygo 于 2017-9-14 00:03 编辑
既然定时器学习的差不多了,还有就是输入捕获了。输入捕获就让大家去完成了,在这里我也就不写了,嘿嘿。输入捕获可以测量频率,占空比以及电机编码器的值(脉冲数的值),也比较好玩的。好的,那么就进入正题吧,这次就进入到串口的学习,那么先先学习简单的吧,printf打印数据输出到串口显示,还有利用scanf实现从串口输入数据然后数据又通过printf打印出来。
注意:板载的虚拟串口是usart2(所以下面的配置是针对串口2进行配置的),所以可直接用串口2打印数据,什么是虚拟串口。什么是虚拟串口?虚拟串口也是要靠硬件来实现的,现在市场上有很多协议转换类的产品。比如:USB转串口,网口转串口,光纤转串口等设备。通过厂家自带的软件,可以把PC之外的接口虚拟到你的PC上,成为你计算机的一个COM口,你可以把这个串口打开使用,像你PC上的 COM口一样去用。
那么下面就开始配置串口吧:
(1)、新建工程就不用说了吧,前面都说的十分清楚地,如果还不清楚话,可以去看前面我的帖子。
(2)、选择串口2且设置为一步通信方式,PA2设置发送引脚,PA3设置为接收引脚。如下图:
(3)、时钟配置,选择内部高速时钟(HSI),如下图:
(4)、串口配置相关参数:
串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。如下如图:
C语言中的标准库中所用的标准输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:重定向是指用户可以自己重写C 的库函数,当连接器检查到用户编写了与C 库函数相同名字的函数时,优先采用用户编写的函数,这样用户就可以实现对库的修改了。为了实现重定向printf()和scanf() 函数,我们需要分别重写fputc()和fgetc() 这两个C 标准库函数,代码如下:
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart2,&ch, 1, 0xffff);
return ch;
}
注意这里用的是轮询的方式,谈到串口这里不得不说串口的三种通信模式:
第一种是上面用到的轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
(5)、编写用户代码:
在uart.c写上上面代码即可,主函数代码如下:
int main(void)
{
char data;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
printf("云汉lygo....\r\n");
while (1)
{
if(scanf("%s",data) == 1)//表示输入类型与%s相同,其实不要也行
{
printf("data:%s\r\n",data);
break;
}
}
(6)、串口打印图:
下一篇就是用DMA来接收并处理不定长数据了,好的谢谢大家!!!
本次实验文档如下: