打印
[MM32软件]

MM32F0020T之GPIO控制篇

[复制链接]
715|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-8-12 15:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
MM32是灵动微电子开发的高性能Arm® Cortex-M0 为内核的 32 位微控制器,最高工作频率可达 48MHz,内置高速存储器,丰富的增强型 I/O 端口和多种外设,可以看到这款新芯片可以完成基本的嵌入式实现。以下是这款芯片的主要资源:

- 32KB Flash,2KB SRAM
- 1 个 12 位的 ADC
- 1 个 16 位通用定时器、1 个 16 位基本定时器、1 个 16 位高级定时器
- 2 个 UART 接口、1 个 SPI 接口和 1 个 I2C 接口

可以说是麻雀虽小,五脏俱全,打个不太恰当的比方:ADC是它的眼睛,定时器则是心脏,UART是喉舌,I2C是内部神经,SPI是血管了。

那么GPIO是什么呢?个人感觉就是手足,可以用来操作,作为输出,也可以触摸外界作为输入信号。我们基于灵动微电子的开发板设计焊接了一块开发板。大概长这样:



1.GPIO概述
首先讲一下GPIO的基本概念,为什么说GPIO是微控制器的手足呢?手足作为和外界最基本的交流方式,MM32F0020是怎样实现的呢?

MM32F0020这块芯片的GPIO可以配置为 8 种模式:模拟输入、浮空输入、上拉输入、下拉输入、推挽输出、开漏输出、复用推挽输出和复用开漏输出。来看一下GPIO的功能框图:



由图可以看到:

输出主要是通过两个连接至vdd和vss的晶体管实现推挽和开漏输出,因为有片上复用功能,所以有相应的复用推挽和复用开漏输出。
输入主要上拉vdd实现上拉输入,接入vss实现下拉输入,模拟输入直接接入信号。
输入输出的寄存器配置可以参考下表:



2.GPIO电路
GPIO作为输出,外接LED,原理图如下:



LED灯接入电压VDD,并且通过一个2.2k的电阻接入相应的GPIO引脚。

作为输出,可以外接按键,原理图如下:



按键这里,SW1是用的上拉按键,缺省状态为通过R2保持低电平,当按键按下时,电平变成高电平,其他三个按键都是下拉按键。

3.软件编程
嵌入式编程是一种将程序逻辑与现实硬件结合的编程,这里涉及到几个角色,从一个控制的想法到真正的实现需要用到这些:

嵌入式软件开发环境:主要作用是编写程序,然后将编写的程序编译成MCU能执行的HEX格式的文件,再把程序下载进芯片;除此之外,最重要的软件开发环境可以通过仿真器实现实时仿真,控制和实时查看MCU变量。
MCU微控制器:实施控制检测的控制器,执行嵌入式编写下载好的文件,可以认为是程序在现实中执行的具体实现;
外围控制电路:以LED电路控制为例,程序执行的最终目的是为了实现对外设的控制。
所以嵌入式控制编程,需要使能微控制的内部资源,根据外围电路配置控制模式,根据控制需求调用相应的功能,总结起来就是:

使能=>配置=>调用

GPIO的使能和配置程序:

/// @brief  initialize LED GPIO pin
/// @NOTE   if use jtag/swd interface GPIO PIN as LED, need to be careful,
///         can not debug or program.
/// @param  None.
/// @retval None.

void LED_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
    GPIO_StructInit(&GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_12;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    LED1_OFF();
    LED2_OFF();
    LED3_OFF();
    LED4_OFF();

    LED1_ON();
    LED2_ON();
    LED3_ON();
    LED4_ON();
}

对四个LED灯进行了端口和引脚配置,对应的引脚为PA1,PA4,PA9和PA12,这里外围电路引脚的复用:



调用程序
#define LED1_Port  GPIOA
#define LED1_Pin   GPIO_Pin_1
#define LED2_Port  GPIOA
#define LED2_Pin   GPIO_Pin_4
#define LED3_Port  GPIOA
#define LED3_Pin   GPIO_Pin_9
#define LED4_Port  GPIOA
#define LED4_Pin   GPIO_Pin_12

#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))

主循环控制程序如下:


/// @brief  This function is main entrance.
/// @param  None.
/// @retval  0.

s32 main(void)
{
    LED_Init();
    DELAY_Init();
    while(1) {
        LED1_TOGGLE();
        LED2_TOGGLE();
        LED3_TOGGLE();
        LED4_TOGGLE();
        DELAY_Ms(1000);
    }

}

实现的效果就是4个LED的闪烁。

4.实验效果

首先是连线,仿真器是SWD连线,4根线,分别是VCC,SWDIO,SWCLK,GND,开发板是20PIN的JTAG接口,对应的连线图如下:



实物连线效果如下:



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_36310542/article/details/139880461

使用特权

评论回复
沙发
可怜的小弗朗士| | 2024-8-12 16:28 | 只看该作者
这个板子是官方的吗,好好看

使用特权

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

本版积分规则

2028

主题

15903

帖子

13

粉丝