在现在用华大的芯片比较多整理了一些常用的函数和方法。
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(); //清零累加采样值