这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » liuyuliuyu1216 ST L053试用进程帖

共8条 1/1 1 跳转至

liuyuliuyu1216 ST L053试用进程帖

工程师
2015-12-16 23:34:36     打赏

感谢论坛提供了这次活动,能够有机会试用STM32的低功耗MCU。

还是先晒下图吧,包装和其他系列的Nucleo开发板基本上一样,当然板卡看上去也是和其他Nucleo系列的开发板一样,主要的差别就是MCU了吧。下面,就开始准备学习使用STM32 L053的一些外设和特性。



开发环境:MDK5.14 和STM32CubeMX4.11。

1.Hello流水灯-->四楼

2.按键(轮询,中断)-->五楼

3.串口(轮询,中断,DMA)-->六楼



助工
2015-12-26 09:26:14     打赏
2楼
继续更新哦~

院士
2015-12-26 22:15:27     打赏
3楼
楼主 人去哪里啊~~

工程师
2015-12-28 23:32:29     打赏
4楼

    像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)
这可以控制输出高电平还是低电平

 




工程师
2015-12-29 00:06:18     打赏
5楼

利用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配置成外部中断模式
在STM32CubeMX4.11中将PC13的模式改为GPIO_EXTI13模式。点击Configuration栏的GPIO项,配置PC13为下降沿中断模式;点击Configuration栏的NVIC项,使能中断,并配置优先级,将优先级设置比系统定时器的低,也可以改变优先级分组。具体配置过程如下:


配置完成后,就可以生成工程了。
打开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灯依次点亮和熄灭。




工程师
2015-12-29 00:15:44     打赏
6楼
使用STM32CubeMX配置串口通信,需要用到HAL库。HAL库中实现串口通信有三种方式:轮询、中断和DMA。和串口通信相关的初始化部分通过STM32CubeMX软件配置,具体过程在下面的例子中说明。 轮询模式:为堵塞模式,使用超时管理机制。

发送函数:


HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)


参数: huart: 指向串口结构体(通过STM32CubeMX软件配置串口时会生成,包含串口通信相关的信息)的指针。 pData: 指向发送数据块的指针 Size: 发送数据的数量 Timeout: 超时周期 返回值:HAL status:HAL_OK ,HAL_ERROR,HAL_BUSY ,HAL_TIMEOUT

接收函数:


HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)


参数: huart: 指向串口结构体的指针。 pData: 指向接收数据块的指针 Size: 接收数据的数量 Timeout: 超时周期 返回值:HAL status,HAL_OK ,HAL_ERROR,HAL_BUSY ,HAL_TIMEOUT 必须在指定的时间内接收到指定数量的数据才会返回HAL_OK。 中断模式: 非堵塞模式。和UART相关的中断:发生完成中断,结束中断和错误中断。

发送函数: 用于开启中断发送


HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)


参数: huart: 指向串口结构体的指针。 pData: 指向发送数据块的指针 Size: 发送数据的数量 返回值:HAL status:HAL_OK ,HAL_ERROR,HAL_BUSY

接收函数:用于开启中断接收


HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)


参数: huart: 指向串口结构体的指针。 pData: 指向接收数据块的指针 Size: 接收数据的数量 返回值:HAL status,HAL_OK ,HAL_ERROR,HAL_BUSY ,HAL_TIMEOUT 必须接收到指定数量的数据才会触发中断。 相关的回调函数: HAL_UART_TxCpltCallback():发送完成后,通过中断处理函数调用。 HAL_UART_RxCpltCallback():接收完成后,通过中断处理函数调用。 HAL_UART_ErrorCallback():传输过程中出现错误时,通过中断处理函数调用。 可以在回调函数里定制自己的代码。 DMA模式:非堵塞模式。

发送函数: 用于开启DMA发送


HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)


参数: huart: 指向串口结构体的指针。 pData: 指向发送数据块的指针 Size: 发送数据的数量 返回值:HAL status,HAL_OK ,HAL_ERROR,HAL_BUSY

接收函数:用于开启DMA接收


HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)


参数: huart: 指向串口结构体的指针。 pData: 指向接收数据块的指针 Size: 接收数据的数量 返回值:HAL status,HAL_OK ,HAL_ERROR,HAL_BUSY ,HAL_TIMEOUT 必须接收到指定数量的数据才会完成一次DMA传输。 相关的回调函数(使用回调函数需要开启串口中断): HAL_UART_TxHalfCpltCallback():一半数据(half transfer)发送完成后,通过中断处理函数调用。 HAL_UART_TxCpltCallback():发送完成后,通过中断处理函数调用。 HAL_UART_RxHalfCpltCallback():一半数据(half transfer)接收完成后,通过中断处理函数调用。 HAL_UART_RxCpltCallback():接收完成后,通过中断处理函数调用。 HAL_UART_ErrorCallback():传输过程中出现错误时,通过中断处理函数调用。 可以在回调函数里定制自己的代码。

暂停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)


参数:huart: 指向串口结构体的指针。

返回值:HAL status,HAL_OK


下面通过简单的例子说明用法:

开发板上用到的串口为USART2。


轮询方式:

在STM32CubeMX软件中,在Pinout栏使能USART2为异步模式

最后在configuration栏里,点击USART2,弹出配置对话框,可以配置串口通信相关的参数,中断和DMA。这里先不使能中断和DMA传输:

生成MDK工程并打开,在main.c文件中,定义全局变量用于收发:


uint8_t aRxBuffer[32];


在while循环中,等待接收到指定数量的字符,然后将接收的字符发送出去,超时时间设置为1秒(单位为ms):



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;
}

 




助工
2015-12-29 16:04:29     打赏
7楼
细致,继续加油~

菜鸟
2018-01-18 15:06:15     打赏
8楼

666


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]