板子没有LED,就用蜂鸣器代替了
原理图如下
芯片引脚是R13
查找芯片手册《IMXRT1170IEC》,名称是GPIO_AD_02
GPIO框图
IOMUX复用模式
查找芯片手册《IMXRT1170RM》,引脚GPIO_AD_02对应的MUX寄存器
可以看到,寄存器的MUX_MODE域列出了这个引脚的11个可选功能,把该域设置成1010b即十进制数10即可选中ATL10选项,表示GPIO9_IO01,这个就是引脚的GPIO功能。
也就是说对这个引脚的MUX寄存器,我们给它赋值为10即可控制为GPIO9_IO01功能。
/* 设置MUX寄存器为0x0A,表示把引脚用于普通GPIO */
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_02] = IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(0x0A);
PAD属性配置
由于每个引脚还有多种属性,所以控制时还要根据需求配置好各种属性。
PAD属性配置寄存器包含输入输出属性、上拉保持器的配置,由于控制蜂鸣器时使用的是输出功能,所以只需要配置输出属性和上拉保持器即可。
0 0 //慢压摆率
1 0 //正常驱动强度
2 0 //关闭上下拉、保持器后,任意值无影响
3 0 //关闭上下拉、保持器后,任意值无影响
4 0 //不使用开漏模式
27-5 0
29-28 10 //使用CM7
31-30 00 //不锁定
/* 设置PAD寄存器控制引脚的属性 */
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_02] =(unsigned int) 0x20000000;
控制引脚方向
GDIR寄存器中的每个数据位控制GPIO端口其中一个引脚的方向,为1时表示输出,为0时表示输入。
/* 设置GPIO9_01引脚的方向,使用输出模式 */
GPIO9->GDIR|= (unsigned int)(1<<1);
控制引脚输出电平
设置好引脚方向后,可以通过DR数据寄存器控制引脚的电平。
/* 控制引脚为高电平,关闭蜂鸣器 */
GPIO9->DR |= (unsigned int)(1<<1);
/* 控制引脚为低电平,打开蜂鸣器*/
GPIO9->DR &=~ (unsigned int)(1<<1);
开启外设时钟
设置完GPIO的引脚,控制电平输出,以为现在总算可以打开蜂鸣器 了吧,其实还差最后一步。因为RT1176外设很多,为了降低功耗,每个外设都对应着一个时钟,在芯片刚上电的时候这些时钟都是被关闭的,如果想要外设工作,必须把相应的时钟打开。
/* 开启GPIO9端口的时钟 */
CCM->LPCG[51].DIRECT = 0x00000001;
水到渠成
开启时钟,配置引脚复用模式,配置引脚属性,控制电平,经过这几步,我们总算可以控制一个 蜂鸣器了。
/**
使用寄存器的方法控制蜂鸣器
*/
#include "MIMXRT1176_cm7.h"
/**
* 主函数
*/
int main(void)
{
/* 开启GPIO9端口的时钟 */
CCM->LPCG[51].DIRECT = 0x00000001;
/* 设置MUX寄存器为0x0A,表示把引脚用于普通GPIO */
IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_02] = IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(0x0A);
/* 设置PAD寄存器控制引脚的属性 */
IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_GPIO_AD_02] =(unsigned int) 0x20000000;
/* 设置GPIO9_01引脚的方向,使用输出模式 */
GPIO9->GDIR|= (unsigned int)(1<<1);
//
// /* 控制引脚为高电平,关闭蜂鸣器 */
//GPIO9->DR |= (unsigned int)(1<<1);
/* 控制引脚为低电平,打开蜂鸣器*/
GPIO9->DR &=~ (unsigned int)(1<<1);
while (1);
}
// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)
{
}
下载验证
把编译好的程序下载到开发板并复位,然后蜂鸣器就响了。