stm32cubemx实现简单的串口通信
首先要写代码必须知道变量的数据类型,网上搜索了一下,发现现在stm32使用CMSIS数据结构,具体见下面的表格,原文见:http://forum.eepw.com.cn/thread/215752/1/
言归正传,首先打开stm32cubemx新建一个工程,打开串口USART1,选择异步模式,无流控制。
异步通信的特点是:“一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平,逻辑值),字符本身由5-7位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位。停止位和空闲位都规定为高电平(逻辑值1),这样就保证起始位开始处一定有一个下跳沿”(http://wenku.baidu.com/linkurl=qI89ODP3jmz95Hyewv5gOTSnYlc2ADzLmDy3rIuA1YDGMToiKXHJIUCInb7Ld4j030QgC_Qbaa2wH9t0T8Mr_5bj6z1AlUEIUAQ0lZvaQ0e)
接下来选择Clock Configuration配置时钟,其实如果使用内部时钟的话cube就帮你配置好了。如果使用外部时钟的话在上面的步骤中选择bypass clock source(旁路时钟源)或者crystal/ceramic resonator(晶体/陶瓷晶振)就可以了。
下一步在Configuration界面选择USART1,在弹出的界面中可以根据使用的要求设置波特率、数据位长度、奇偶校验位,停止位,还可以控制串口是收发模式还是只收或者只发模式,over sampling一般设置成16(具体为什么还没仔细研究过,欢迎交流),点击Apply->OK就配置完成了。生成工程文件时,可以使用Keil和IAR。看网上多用Keil,但是我使用最新的F411时,Keil出现很多问题。不是低版本的Keil4不支持F411,要么就是现在cube还不支持Keil5,所以只能选择IAR了,实践证明是可行的!
打开IAR工程文件,在user code区域加上以下代码:
/* USER CODE BEGIN 1 */
#define ordersize 1
uint8_t myorder[ordersize];
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
GPIO_PinState KEY;
myorder[0]='r';
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
/* Infinite loop */
while (1)
{
KEY=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13);
if(KEY==GPIO_PIN_RESET)
{
if(HAL_UART_Transmit(&huart1,(uint8_t * )myorder,ordersize,5000)==HAL_OK)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
}
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
}
}
/* USER CODE END 3 */
代码的主要功能就是按一下键,就串口发送字符串myorder,如果发送成功就绿灯亮,松开按键就绿灯灭。
今天就先写到这,后面还会继续完善的。
stm32f10x.h文件中包含了常用的布尔形变量定义,如:
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
CMSIS IO类型限定词
IO类限定词 | #define | 描述 |
_I | volatile const | 只读访问 |
_O | volatile | 只写访问 |
_IO | volatile | 读和写访问 |
固件库与CMSIS数据类型对比
固件库类型 | CMSIS类型 | 描述 |
s32 | int32_t | 易挥发只读有符号32位数据 |
s16 | int16_t | 易挥发只读有符号16位数据 |
s8 | int8_t | 易挥发只读有符号8位数据 |
sc32 | const int32_t | 只读有符号32位数据 |
sc16 | const int16_t | 只读有符号16位数据 |
sc8 | const int8_t | 只读有符号8位数据 |
vs32 | _IO int32_t | 易挥发读写访问有符号32位数据 |
vs16 | _IO int16_t | 易挥发读写访问有符号16位数据 |
vs8 | _IO int8_t | 易挥发读写访问有符号8位数据 |
vsc32 | _I int32_t | 易挥发只读有符号32位数据 |
vsc16 | _I int16_t | 易挥发只读有符号16位数据 |
vsc8 | _I int8_t | 易挥发只读有符号8位数据 |
u32 | uint32_t | 无符号32位数据 |
u16 | uint16_t | 无符号16位数据 |
u8 | uint8_t | 无符号8位数据 |
uc32 | const uint32_t | 只读无符号32位数据 |
uc16 | const uint16_t | 只读无符号16位数据 |
uc8 | const uint8_t | 只读无符号8位数据 |
vu32 | _IO uint32_t | 易挥发读写访问无符号32位数据 |
vu16 | _IO uint16_t | 易挥发读写访问无符号16位数据 |
vu8 | _IO uint8_t | 易挥发读写访问无符号8位数据 |
vuc32 | _I uint32_t | 易挥发只读无符号32位数据 |
vuc16 | _I uint16_t | 易挥发只读无符号16位数据 |
vuc8 | _I uint8_t | 易挥发只读无符号8位数据 |