STM32CUBE学习——2

本文介绍了如何使用STM32CubeMX实现简单的串口通信,包括选择变量数据类型、配置时钟、设置USART参数以及编写控制串口发送的代码。通过实例演示了按键触发串口发送字符串并控制LED灯亮灭的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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位数据


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值