在现在用华大的芯片比较多整理了一些常用的函数和方法。
IO口输出低电平
原型 en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例 Gpio_ClrIO(GpioPortA ,GpioPin1 ); //PA01端口输出低电平
IO口输出高电平
原型 en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例 Gpio_SetIO(GpioPortA ,GpioPin1 ); //PA01端口输出高电平
原型 boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例 u8PA1Stat = Gpio_GetInputIO(GpioPortA ,GpioPin1);
//u8PA1Stat 为PA1端口输入电平状态
原型 boolean_t Gpio_ReadOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例 u8PA1Stat = Gpio_ReadOutputIO(GpioPortA ,GpioPin1); //u8PA1Stat 为PA1端口输出电平状态
原型 en_result_t Gpio_ClrPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
举例 Gpio_ClrPort(GpioPortA , 0x000F); //PA0~PA3输出低电平,其余保持
原型 en_result_t Gpio_SetPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
举例 Gpio_SetPort(GpioPortA , 0x000F); //PA0~PA3输出高电平,其余保持
原型 uint16_t Gpio_GetInputData(en_gpio_port_t enPort)
举例 u16PAInputData = Gpio_GetInputData(GpioPortA ); //u16PAInputData的值为PA组输入数据
可根据在官网中的文件配置相关的寄存器,例如外部晶振的复用
M0P_CLOCK->PERI_CLKEN_f.GPIO=1; //gpio时钟使能
M0P_GPIO->P01_SEL_f.SEL=0; //普通端口
//M0P_GPIO->P0DIR_f.P01=1; //配置成输入
M0P_GPIO->P0ADS_f.P01=0; //配置为数字端口用于判断高低电平
初始化
// 初始化外部IO P32
// Gpio_InitIOExt(3,2, GpioDirIn, TRUE, FALSE, FALSE, 0);//输入模式 下拉
// Gpio_SetIO(3, 2, TRUE);//输出高电平,P32使能 外部中断
// 开启GPIO外部中断
// Gpio_ClearIrq(3, 2);//清除中断标志位
// Gpio_EnableIrq(3, 2, GpioIrqLow);//中断设置 P32低电平触发
// EnableNvic(PORT3_IRQn, DDL_IRQ_LEVEL_DEFAULT, TRUE);//中断使能 通道3 第二优先级 每十个引脚一个通道
中断处理函数
void Gpio_IRQHandler(uint8_t u8Param)//中断服务函数
{
*((uint32_t *)((uint32_t)&M0P_GPIO->P3ICLR + u8Param * 0x40)) = 0;
//内容
Gpio_ClearIrq(3,2);//清除中断标志位
}
ADC初始化
stc_adc_cfg_t stcAdcCfg;
stc_adc_norm_cfg_t stcAdcNormCfg;
DDL_ZERO_STRUCT(stcAdcCfg);
DDL_ZERO_STRUCT(stcAdcNormCfg);
if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE))
{
return ;
}
Gpio_SetAnalog(0, 2, TRUE);
Gpio_SetAnalog(3, 5, TRUE);
Adc_Enable();
M0P_BGR->CR_f.BGR_EN = 0x1u;//BGR必须使能
M0P_BGR->CR_f.TS_EN = 0x0u;
delay100us(1);
stcAdcCfg.enAdcOpMode = AdcNormalMode; //单次采样模式
stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1; //PCLK
stcAdcCfg.enAdcSampTimeSel = AdcSampTime12Clk; //4个采样时钟
stcAdcCfg.enAdcRefVolSel = RefVolSelInBgr2p5; //参考电压:内部2.5V(avdd>3V,SPS<=200kHz) SPS速率 = ADC时钟 / (采样时钟 + 16CLK)
stcAdcCfg.bAdcInBufEn = FALSE; //电压跟随器如果使能,SPS采样速率 <=200K
stcAdcCfg.u32AdcRegHighThd = 0u; //比较阈值上门限
stcAdcCfg.u32AdcRegLowThd = 0u; //比较阈值下门限
stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable; //ADC转换自动触发设置
stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
Adc_Init(&stcAdcCfg);
stcAdcNormCfg.enAdcNormModeCh = AdcExInputCH8; //通道8 P02
stcAdcNormCfg.bAdcResultAccEn = FALSE;
Adc_ConfigNormMode(&stcAdcCfg, &stcAdcNormCfg);
stcAdcNormCfg.enAdcNormModeCh = AdcExInputCH5; //通道5 P35
stcAdcNormCfg.bAdcResultAccEn = FALSE;
Adc_ConfigNormMode(&stcAdcCfg, &stcAdcNormCfg);
使用读取数值
Adc_Start();
while(FALSE != Adc_PollBusyState());
Adc_GetResult(&u16AdcResult);
Adc_ClrAccResult(); //清零累加采样值