这是我的第一篇博客,也是我寒假回老家写的第一个程序,由于没有网络只能先打草稿了,还有二十多天就要开学了,抓紧时间准备蓝桥杯!
这次串口实验想要实现的效果是电脑向单片机发送一段信息,单片机收到后返回给电脑。
串口想必是STM32最重要的外设之一吧,usart.c里面主要分为以下几个步骤进行:
1:配置时钟;
2:配置GPIO;
3:配置USART;
4:USART使能以及串口中断使能;
5:配置中断;
6:中断函数;
以下是主要过程:
#include "usart.h"
void MY_USART_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{
u16 data;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
data=USART_ReceiveData(USART1);
USART_SendData(USART1,data);
}
*************************************************
加入了新的功能:直接向电脑发送字符串。
加入此函数可实现:
void USART_SendString(char *str)
{
u8 index=0;
do
{
USART_SendData(USART1,str[index]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);(容易遗漏!!)
index++;
}
while(str[index]!=0);
}
这里要特别注意的是:stm32怎么使用printf
1:void USART_SendString(char *str)必须是char型变量,不能用u8来定义,否则会出现黄
感叹号标记。
2:index必须赋初值0,否则字符串前会出现乱码。
在VC6中我们常用到printf函数,非常方便,这里我们对程序加入一些函数,也可以实现这种效果。
首先在usart.h中加入#include “stdio.h”,然后在usart.c中加入
int fputc(int ch, FILE *f)
{
USART_ClearFlag(USART1,USART_FLAG_TC);(必须加上这句!!否则会出现第一句首字母丢失问题!!根本原因是因为SR寄存器中的TC标志默认是置1的。如果不加,写字符串的时候,前面留一个空格也行)
USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
return (ch);
}
最后在魔术棒->target中勾选use Micro LIB。
以上三步,缺一不可!!!!!!!!!!!!!!!!
使用这种重定向,代价是造成代码量急剧上升,请读者权衡。
关于stm32重定向scanf函数:
发现原来u8是unsigned char uint8_t,u16和32才是unsigned int型的,所以调用printf和scanf函数时u8 格式控制应该是%s 。
Sprintf函数在在加stdio.h的情况下即可调用;
STM32中串口一次最多能接受几位数据?
一直弄不明白上位机为什么发送一串字符串给下位机都能收到,STM32数据寄存器到底是几位啊
一直弄不明白上位机为什么发送一串字符串给下位机都能收到,STM32数据寄存器到底是几位啊
串口都是一次接一组数据,具体是几位要看你设置的比如9600 N,8,1那样是8个数据位,1个起始位,1个停止位(起始和停止位是芯片接收部分自己判断的)
之所以发一组都能收到是因为STM32(其实51也一样的,不信你可以试试)运行速度要远大于串口发送数据的速度。比如9600波特率,就是1秒钟发9600个位(bit)这样按N,8,1算的话是10个位(bit)是1个字节(加起始和停止位,还有8个数据位)也就是1秒钟发送960个8位数据。1/960=0.00104秒(1.04ms)发送一个字节 而单片机运行指令周期都是以us为单位的。换算下来就是也是1040us了 按51单片机1us执行一个指令的话,接受一个字节的过程中,芯片可以执行1040个指令,完全可以运算处理完成在发送回去.更何况是速度更高的STM32 1.25MPS的处理速度
接收一个字节数据的时间,够他完成N个复杂的运算处理。
之所以发一组都能收到是因为STM32(其实51也一样的,不信你可以试试)运行速度要远大于串口发送数据的速度。比如9600波特率,就是1秒钟发9600个位(bit)这样按N,8,1算的话是10个位(bit)是1个字节(加起始和停止位,还有8个数据位)也就是1秒钟发送960个8位数据。1/960=0.00104秒(1.04ms)发送一个字节 而单片机运行指令周期都是以us为单位的。换算下来就是也是1040us了 按51单片机1us执行一个指令的话,接受一个字节的过程中,芯片可以执行1040个指令,完全可以运算处理完成在发送回去.更何况是速度更高的STM32 1.25MPS的处理速度
接收一个字节数据的时间,够他完成N个复杂的运算处理。
串口波特率不能太高,否则乱码,最好是9600;
浪费很多时间,只是因为GPIO的USART模式代码我是直接从库里面复制过来的,没发现错了,库里面是GPIO_Mode_Out_PP,其实是GPIO_Mode_AF_PP;
warning: #167-D: argument of type "u8 *" is incompatible with parameter of type "char *rest
rict"
出问题的是这行:sprintf(s,"%02.0f",(float)Sensor_Box.ad7730_1);
看了下sprintf函数的原型是:
int sprintf( char *buffer, const char *format [, argument] … );
请问该怎么修改实参,使其与形参类型一致?
看了下sprintf函数的原型是:
int sprintf( char *buffer, const char *format [, argument] … );
请问该怎么修改实参,使其与形参类型一致?
答:把s类型由(u8* 也可能是 unsinged char*)改成char*
或者简单的改成sprintf((char*)s,"%02.0f",(float)Sensor_Box.ad7730_1);
或者简单的改成sprintf((char*)s,"%02.0f",(float)Sensor_Box.ad7730_1);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论