感谢论坛提供了这次活动,能够有机会试用STM32的低功耗MCU。
还是先晒下图吧,包装和其他系列的Nucleo开发板基本上一样,当然板卡看上去也是和其他Nucleo系列的开发板一样,主要的差别就是MCU了吧。下面,就开始准备学习使用STM32 L053的一些外设和特性。
开发环境:MDK5.14 和STM32CubeMX4.11。
1.Hello流水灯-->四楼
2.按键(轮询,中断)-->五楼
3.串口(轮询,中断,DMA)-->六楼
感谢论坛提供了这次活动,能够有机会试用STM32的低功耗MCU。
还是先晒下图吧,包装和其他系列的Nucleo开发板基本上一样,当然板卡看上去也是和其他Nucleo系列的开发板一样,主要的差别就是MCU了吧。下面,就开始准备学习使用STM32 L053的一些外设和特性。
开发环境:MDK5.14 和STM32CubeMX4.11。
1.Hello流水灯-->四楼
2.按键(轮询,中断)-->五楼
3.串口(轮询,中断,DMA)-->六楼
像Hello World一样,流水灯也算是学习开发板时第一个接触的。STM32L053开发板上也1个LED,就从LED开始,一点一点的学习使用STM32L053。电路图比较简单就不上了,下面新建工程时会提到怎么找到对应的GPIO口。
下面开始配置过程:
通过 STM32CubeMX4.11配置与LED相关的GPIO,生成MDK工程。打开 STM32CubeMX4.11软件,新建工程。
使用Board Selector选择NUCLEO L053。
可以在Pinout里看到,板卡对应的引脚都配置好了,LED对应PA5。
在Clock Configration里配置时钟为32MHz
在Configuration里点击GPIO配置和GPIO相关的属性。
选择PA5,可以配置与输出相关的属性。
配置好,就可以生成工程了。
选择生成MDK5工程,
勾选Generated Files项的第一个,为每个外设生成单个文件。
最后,打开生成的工程,在main.c文件的main函数的while循环里加入以下代码:
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); HAL_Delay(1000);
这样就可以让LED闪烁了。
第一行代码为让对应的GPIO口电平翻转。
第二行代码为延时函数,单位为毫秒,通过滴答定时器完成。
改变输出电平也可以用
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
这可以控制输出高电平还是低电平
利用GPIO的输入功能加入按键控制。下面为电路图
通过电路图可以看出,与按键控制相关的引脚为PC13,按键按下时为低电平。获取按键的值有两种方法,第一种是把PC13配置成普通输入模式,直接读PC13的值来判断按键是否按下,第二种是把PC13配置成中断模式,通过中断的方式判断按键是否按下。前一种方法需要通过轮询的方式实现,实时性不如中断方式。下面分别实现两种方法:
(1)轮询,PC13配置成普通输入模式
在STM32CubeMX4.11中Pinout里先找到PC13,选择GPIO_Input模式。在Configuration栏的GPIO里配置PC13。具体配置过程如下:
配置完后生成工程。
打开MDK工程,在main.c文件的main函数的while循环中代码替换为:
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == GPIO_PIN_RESET) //对输入值 { HAL_Delay(20); if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == GPIO_PIN_RESET) { HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); } }
编译下载,就可以实现简单按键控制LED。
(2)中断,PC13配置成外部中断模式
配置完成后,就可以生成工程了。
打开MDK工程,在main.c文件的main函数的while循环中不加入任何代码。在gpio.c文件中直接加入中断处理的回调函数,不需要声明。程序中,会通过中断处理函数调用该函数。如果没有生成gpio.c文件的话可以直接在main.c文件中加入。具体代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_13) { HAL_Delay(20); if (GPIO_Pin == GPIO_PIN_13) { HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); } } }
编译,下载,通过按键,会控制LED灯依次点亮和熄灭。
发送函数:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
接收函数:
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
发送函数: 用于开启中断发送
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
接收函数:用于开启中断接收
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
发送函数: 用于开启DMA发送
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
接收函数:用于开启DMA接收
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
暂停DMA传输:
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)
恢复DMA传输:
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
停止DMA传输:
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
返回值:HAL status,HAL_OK
下面通过简单的例子说明用法:
开发板上用到的串口为USART2。
轮询方式:
在STM32CubeMX软件中,在Pinout栏使能USART2为异步模式
最后在configuration栏里,点击USART2,弹出配置对话框,可以配置串口通信相关的参数,中断和DMA。这里先不使能中断和DMA传输:
生成MDK工程并打开,在main.c文件中,定义全局变量用于收发:
uint8_t aRxBuffer[32];
while(HAL_UART_Receive(&huart2, (uint8_t *)aRxBuffer, 5, 1000) != HAL_OK) { //接收失败处理 } if(HAL_UART_Transmit(&huart2,(uint8_t *)aRxBuffer,5,1000) == HAL_OK) { //发送失败处理 } HAL_Delay(100);
编译下载,使用串口调试助手,发送长度为5的字符串,调试过程如下:
中断模式:
上面配置的基础上,使能串口中断,并配置优先级,也可以改变优先级分组:
在生成的MDK工程中,定义全局变量用于收发:
uint8_t aRxBuffer[32]; uint8_t Rx_flag = 0;
通过Rx_flag控制发送接收的数据。在主函数的while循环之前开启接收中断:
HAL_UART_Receive_IT(&huart2,(uint8_t *)aRxBuffer,12);
在while循环中将接收的数据发送出去
if(Rx_flag == 1) { HAL_UART_Transmit_IT(&huart2,(uint8_t *)aRxBuffer,32); Rx_flag = 0; }在usart.c文件中声明外部变量:extern uint8_t aRxBuffer[32]; extern uint8_t Rx_flag;加入收发回调函数,在接收回调函数里将Rx_flag置1控制发送,并在此开始中断接收:void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle) { //发送中断处理 } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { Rx_flag = 1; HAL_UART_Receive_IT(&huart2,(uint8_t *)aRxBuffer,12); }编译下载,使用串口调试助手,需要注意发送字符串的长度,调试过程如下:
DMA模式:添加的代码基本上和中断模式相同,只是将在上面配置的基础上,使能DMA,并为发送和接收选择DMA通道:
HAL_UART_Receive_IT(&huart2,(uint8_t *)aRxBuffer,12); HAL_UART_Transmit_IT(&huart2,(uint8_t *)aRxBuffer,32);分别替换为HAL_UART_Receive_DMA(&huart2,(uint8_t *)aRxBuffer,12); HAL_UART_Transmit_DMA(&huart2,(uint8_t *)aRxBuffer,32);编译下载,使用串口调试助手,需要注意发送字符串的长度,调试过程如下:
最后,关于串口重定向可以参考一下代码,需要包含stdio.h,可以替换成中断或DMA模式,这样就可以使用printf和scanf函数:
int fputc(int ch,FILE *fp)
{
HAL_UART_Transmit(&huart3,(uint8_t *)&ch,1,5000);
return ch;
}
int fgetc(FILE *fp)
{
uint8_t ch;
HAL_UART_Receive(&huart3,(uint8_t *)ch,1,5000);
return ch;
}
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |