打印
[MM32软件]

MM32F0020 GPIO驱动LED灯(MM32F0020 GPIO Toggle)

[复制链接]
1159|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
目录:
1.MM32F0020简介
2.MM32F0020系统时钟配置
3.MM32F0020的GPIO外设配置及其初始化
4.使用官网的Systick定时器做延时
5.MM32F0020 GPIO驱动LED灯
提要:
  本实例学习MM32F0020的GPIO外设的配置,配置PA1、PA7、PA9、PA11为推挽输出模式驱动LED1~LED4灯翻转,每隔1s时间(使用官网的Systick延时)翻转1次LED灯的状态。
内容:
1、MM32F0020简介
  (1)MM32F0020微控制器是基于Arm® Cortex®-M0内核,最高工作频率可达48MHz;
  (2)供电电压支持:2.0V - 5.5V;
  (3)多达32KB的Flash,2KB的SRAM;
  (4)1个I2C;
  (5)2个UART;
  (6)1个12位的共8通道的ADC;
  (7)1个I2C或I2S;
  (8)1个16位高级定时,1个16位通用定时器,1个16位基本定时器;
  (9)1个IWDG和一个WWDG看门狗。
2.MM32F0020系统时钟配置:
  如下图1所示,1.MM32F0020可以使用外部HSE 8M时钟倍频到48M作为系统时钟,2.也可使用内部HSI 8M时钟倍频到48M作为系统时钟,二者选择其1,选择打开对应的时钟宏即可,本实例选择2开启HSI 8M倍频到48M时钟作为MM32F0020的系统时钟。
3.MM32F0020的GPIO外设配置及其初始化:
  MM32F0020每个外设都有其对应的时钟,在使用外设前应先配置使能其外设时钟,本实例使用GPIOA外设的PA1、PA7、PA9、PA11驱动LED灯每隔1s翻转1次做LED等的1s闪烁实验
具体配置步骤,及其初始化如下:
(1)使能GPIOA外设时钟;
(2)配置IO的管脚;
(3)配置GPIO的输出速度;
(4)配置IO管脚的工作模式;
(5)根据GPIOA配置的参数整体初始化GPIO各管脚的成员参数。
使用宏定义定义GPIOA的PA1、PA7、PA9、PA11驱动LED1~LED4代码如下,使用宏定义方便代码维护,需要更换GPIO端口或管脚时只需在宏定义中修改对应的端口GPIOx和GPIO_Pin_x即可
#define LED1_PORT  GPIOA
#define LED1_PIN   GPIO_Pin_1
#define LED2_PORT  GPIOA
#define LED2_PIN   GPIO_Pin_7
#define LED3_PORT  GPIOA
#define LED3_PIN   GPIO_Pin_9
#define LED4_PORT  GPIOA
#define LED4_PIN   GPIO_Pin_11

#define LED1_ON()       GPIO_ResetBits(LED1_PORT,LED1_PIN)
#define LED1_OFF()      GPIO_SetBits(LED1_PORT,LED1_PIN)
#define LED1_TOGGLE()   (GPIO_ReadOutputDataBit(LED1_PORT,LED1_PIN))?(GPIO_ResetBits(LED1_PORT,LED1_PIN)):(GPIO_SetBits(LED1_PORT,LED1_PIN))

#define LED2_ON()       GPIO_ResetBits(LED2_PORT,LED2_PIN)
#define LED2_OFF()      GPIO_SetBits(LED2_PORT,LED2_PIN)
#define LED2_TOGGLE()   (GPIO_ReadOutputDataBit(LED2_PORT,LED2_PIN))?(GPIO_ResetBits(LED2_PORT,LED2_PIN)):(GPIO_SetBits(LED2_PORT,LED2_PIN))

#define LED3_ON()       GPIO_ResetBits(LED3_PORT,LED3_PIN)
#define LED3_OFF()      GPIO_SetBits(LED3_PORT,LED3_PIN)
#define LED3_TOGGLE()   (GPIO_ReadOutputDataBit(LED3_PORT,LED3_PIN))?(GPIO_ResetBits(LED3_PORT,LED3_PIN)):(GPIO_SetBits(LED3_PORT,LED3_PIN))

#define LED4_ON()       GPIO_ResetBits(LED4_PORT,LED4_PIN)
#define LED4_OFF()      GPIO_SetBits(LED4_PORT,LED4_PIN)
#define LED4_TOGGLE()  (GPIO_ReadOutputDataBit(LED4_PORT,LED4_PIN))?(GPIO_ResetBits(LED4_PORT,LED4_PIN)):(GPIO_SetBits(LED4_PORT,LED4_PIN))
MM32F0020 GPIOA的外设配置及其IO的初始化,即PA1、PA7、PA9、PA11驱动LED1~LED4的初始化配置步骤如下代码所示:
void Bsp_LED_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    //Enable GPIOA Clock
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
   
    //Init_struct member with its default value.
    GPIO_StructInit(&GPIO_InitStruct);
    //PA1:LED1,PA7:LED2,PA9:LED3,PA11:LED4
    GPIO_InitStruct.GPIO_Pin  =  LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN;
    //GPIO Speed
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    //Push-pull output
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    //Initializes the gpio peripheral according to the specified parameters in the init struct.
    GPIO_Init(LED1_PORT, &GPIO_InitStruct);
   
    //OFF LED1~LED4
    LED1_OFF();
    LED2_OFF();
    LED3_OFF();
    LED4_OFF();
    //ON LED1~LED4
    LED1_ON();
    LED2_ON();
    LED3_ON();
    LED4_ON();
}
4.使用官网的Systick定时器做延时:
  在main函数中调用Systick定时器初始化函数,作为LED1~LED4翻转闪烁延时,只需调用DELAY_Init();即可。
5.MM32F0020 GPIO驱动LED灯:
  如下代码所示,在main函数中调用Systick定时器初始化函数DELAY_Init和LED初始化函数Bsp_LED_Init,在while(1)主循环中调用之前宏定义的LED1_TOGGLE ~ LED4_TOGGLE翻转功能,
然后调用DELAY_Ms(1000);即1s延时函数,则实现PA1、PA7、PA9、PA11每隔1s驱动翻转1次LED1~LED4灯的状态,实现LED1~LED4灯的闪烁。
4.使用官网的Systick定时器做延时:

  在main函数中调用Systick定时器初始化函数,作为LED1~LED4翻转闪烁延时,只需调用DELAY_Init();即可。

5.MM32F0020 GPIO驱动LED灯:

  如下代码所示,在main函数中调用Systick定时器初始化函数DELAY_Init和LED初始化函数Bsp_LED_Init,在while(1)主循环中调用之前宏定义的LED1_TOGGLE ~ LED4_TOGGLE翻转功能,

然后调用DELAY_Ms(1000);即1s延时函数,则实现PA1、PA7、PA9、PA11每隔1s驱动翻转1次LED1~LED4灯的状态,实现LED1~LED4灯的闪烁。



762446721d3819b0f5.png (563.47 KB )

762446721d3819b0f5.png

使用特权

评论回复
沙发
呐咯密密|  楼主 | 2024-10-30 14:36 | 只看该作者
总结:

  本实例学习MM32F0020的GPIO外设的配置,配置PA1、PA7、PA9、PA11为推挽输出模式驱动LED1~LED4灯翻转,每隔1s(使用官网的Systick延时)翻转1次LED灯的状态。

注意事项:

  (1)配置系统时钟为HSI 8M倍频到48M或使用HSE 8M倍频到48M时钟(开启对应的时钟宏即可,其它时钟频率也可添加自定义时钟宏)

  (2)使用外设时比如GPIOA外设,需使能GPIOA外设时钟。

使用特权

评论回复
板凳
beyikyo| | 2024-10-31 16:54 | 只看该作者
我在使用 MM32F5330 时,需要它同时与多个设备通信,比如通过 SPI 和 I2C 连接不同传感器。在这个过程中,有时候会出现数据冲突的情况,比如接收的数据出现乱码或者丢失部分数据。我已经检查过基本的配置参数,看起来没有问题。想问问大家有没有遇到过类似的情况?是怎么解决的呢?是需要在软件层面加一些数据校验和重传机制,还是在硬件连接上有特殊的处理方法呢?

使用特权

评论回复
地板
suncat0504| | 2024-11-7 18:16 | 只看该作者
beyikyo 发表于 2024-10-31 16:54
我在使用 MM32F5330 时,需要它同时与多个设备通信,比如通过 SPI 和 I2C 连接不同传感器。在这个过程中, ...

是用外设处理的,还是软件模拟处理的?软件模拟的,SPI还好,I2C的很容易因为中断打断处理过程,导致处理时序出问题,导致数据收发异常。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

497

主题

3881

帖子

47

粉丝