正点原子IM6基于SDK2.2 > LED按钮和蜂鸣器驱动



#include "fsl_iomuxc.h"
#include "fsl_gpio.h"
#include "fsl_gpt.h"
#include "td_ledkeybeep.h"
//中断处理函数
void TD_Beep_IRQHandler(uint32_t giccIar, void *param);
//中断中用于计时来设置beep的响的次数和当前是否应该响
static int gBeepTimerCount;
/**********************************************************************************
正点原子imx6ull中的led=>gpio1-3-低电平亮,key=>gpio1-18-低电平按下,beep=>gpio5-1-低电平响
**********************************************************************************/
void Td_LedKeyBeep_Init(void)
{
  IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0U);
  IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 
                        IOMUXC_SW_PAD_CTL_PAD_DSE(6U) |
                        IOMUXC_SW_PAD_CTL_PAD_SPEED(2U) |
                        IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
                        IOMUXC_SW_PAD_CTL_PAD_PUS(2U));
  IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0U);
  IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 
                        //IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |//设置快速翻转io
                        //IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |//设置开漏输出
                        //IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |//设置为keeper,1=pull,0=keeper
                        //IOMUXC_SW_PAD_CTL_PAD_HYS_MASK |//设置开启施密特触发器,可以过滤波形
                        IOMUXC_SW_PAD_CTL_PAD_DSE(6U) |//输出驱动能力设置为R0/6,0=关闭,1=R0_260_Ohm___3_3V__150_Ohm_1_8V__240_Ohm_for_DDR
                        IOMUXC_SW_PAD_CTL_PAD_SPEED(2U) |//速度设置为100mhz,0=50mhz,3=200mhz
                        IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |//pull或者keeper功能使能,两个功能互斥
                        IOMUXC_SW_PAD_CTL_PAD_PUS(2U));//上下拉设置,2=100k上拉,0=100k下拉
  IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0U);
  IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 
                        //IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |//设置快速翻转io
                        //IOMUXC_SW_PAD_CTL_PAD_ODE_MASK |//设置开漏输出
                        //IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |//设置为keeper,1=pull,0=keeper
                        //IOMUXC_SW_PAD_CTL_PAD_HYS_MASK |//设置开启施密特触发器,可以过滤波形
                        IOMUXC_SW_PAD_CTL_PAD_DSE(6U) |//输出驱动能力设置为R0/6,0=关闭,1=R0_260_Ohm___3_3V__150_Ohm_1_8V__240_Ohm_for_DDR
                        IOMUXC_SW_PAD_CTL_PAD_SPEED(2U) |//速度设置为100mhz,0=50mhz,3=200mhz
                        IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |//pull或者keeper功能使能,两个功能互斥
                        IOMUXC_SW_PAD_CTL_PAD_PUS(2U));//上下拉设置,2=100k上拉,0=100k下拉
  
  gpio_pin_config_t gp;

  gp.direction = kGPIO_DigitalOutput;
  gp.outputLogic = 0;
  gp.interruptMode = kGPIO_IntHighLevel;
  GPIO_PinInit(GPIO1,3,&gp);
  
  gp.direction = kGPIO_DigitalInput;
  GPIO_PinInit(GPIO1,18,&gp);
  
  gp.direction = kGPIO_DigitalOutput;
  gp.outputLogic = 1;
  GPIO_PinInit(GPIO5,1,&gp);
  
  //通用定时器
  gpt_config_t gc;
  gc.clockSource = kGPT_ClockSource_LowFreq;//使用32k内部时钟
  gc.divider = 319;//分频系数最大为0xfff,320分频得到10ms定时
  gc.enableFreeRun = false;//这里设置cap1寄存器值到达时重新开始计数
  gc.enableRunInWait = false;
  gc.enableRunInStop = false;
  gc.enableRunInDoze = false;
  gc.enableRunInDbg = false;
  gc.enableMode = true;
  GPT_Init(GPT2, &gc);
  
  SystemInstallIrqHandler(GPT2_IRQn, TD_Beep_IRQHandler, NULL);
  
  GPT_SetOutputCompareValue(GPT2, kGPT_OutputCompare_Channel1, 10);//设置比较器为10,得到100ms中断一次
  GPT_EnableInterrupts(GPT2, kGPT_OutputCompare1InterruptEnable);//设置比较器中断
  
  EnableIRQ(GPT2_IRQn);
  GPT_StartTimer(GPT2);
  
  DV_Led1_SetTo(true);
  DV_Beep_SetTo(false);//关闭beep
  DV_Beep_SetTime(1);
}
/**********************************************************************************
正点原子imx6ull中的key的状态1为未按下0为按下
**********************************************************************************/
void TD_Beep_IRQHandler(uint32_t giccIar, void *param)
{
  GPT_ClearStatusFlags(GPT2, kGPT_OutputCompare1Flag);
  if(gBeepTimerCount <= 0) {
    DV_Beep_SetTo(0);
    return;
  }
  gBeepTimerCount--;
  DV_Beep_SetTo((gBeepTimerCount % 6) / 3);
}
/**********************************************************************************
正点原子imx6ull中的key的状态1为未按下0为按下
**********************************************************************************/
int DV_Key0_GetStatue(void)
{
  return (GPIO1->PSR & 0x00040000U) != 0;
}
/**********************************************************************************
正点原子imx6ull中的led设置1为亮0为灭
**********************************************************************************/
void DV_Led1_SetTo(char statue)
{
  if(!statue) GPIO1->DR |= 0x00000008U;
  else GPIO1->DR &= ~0x00000008U;
}
/**********************************************************************************
正点原子imx6ull中的beep响的次数,每次300ms,间隔300ms
**********************************************************************************/
void DV_Beep_SetTime(int tim)
{
  gBeepTimerCount = tim * 6;
}
/**********************************************************************************
正点原子imx6ull中的led设置1为亮0为灭
**********************************************************************************/
void DV_Beep_SetTo(char statue)
{
  if(!statue) GPIO5->DR |= 0x00000002U;
  else GPIO5->DR &= ~0x00000002U;
}
/**********************************************************************************
正点原子imx6ull中的led=>gpio1-3-低电平亮,key=>gpio1-18-低电平按下,beep=>gpio5-1-低电平响
**********************************************************************************/
void Td_LedKeyBeep_Run(void)
{
  Td_LedKeyBeep_Init();
  while(true);
}