• 华大芯片HC32L110C6PA(探索)


    在现在用华大的芯片比较多整理了一些常用的函数和方法。

    1,常用的端口操作库函数

    IO口输出低电平

    1. 原型 en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
    2. 举例 Gpio_ClrIO(GpioPortA ,GpioPin1 ); //PA01端口输出低电平

    IO口输出高电平

    1. 原型 en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
    2. 举例 Gpio_SetIO(GpioPortA ,GpioPin1 ); //PA01端口输出高电平
    获得IO口输入值
    1. 原型 boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
    2. 举例 u8PA1Stat = Gpio_GetInputIO(GpioPortA ,GpioPin1);
    3. //u8PA1Stat 为PA1端口输入电平状态
    获得IO口输出值
    1. 原型 boolean_t Gpio_ReadOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
    2. 举例 u8PA1Stat = Gpio_ReadOutputIO(GpioPortA ,GpioPin1); //u8PA1Stat 为PA1端口输出电平状态
    同时让一组端口中的多个引脚输出低电平
    1. 原型 en_result_t Gpio_ClrPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
    2. 举例 Gpio_ClrPort(GpioPortA , 0x000F); //PA0~PA3输出低电平,其余保持
    同时让一组端口中的多个引脚输出高电平
    1. 原型 en_result_t Gpio_SetPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
    2. 举例 Gpio_SetPort(GpioPortA , 0x000F); //PA0~PA3输出高电平,其余保持
    获取一组IO口的输入数据
    1. 原型 uint16_t Gpio_GetInputData(en_gpio_port_t enPort)
    2. 举例 u16PAInputData = Gpio_GetInputData(GpioPortA ); //u16PAInputData的值为PA组输入数据

    2,特殊端口复用IO

    可根据在官网中的文件配置相关的寄存器,例如外部晶振的复用

    1. M0P_CLOCK->PERI_CLKEN_f.GPIO=1; //gpio时钟使能
    2. M0P_GPIO->P01_SEL_f.SEL=0; //普通端口
    3. //M0P_GPIO->P0DIR_f.P01=1; //配置成输入
    4. M0P_GPIO->P0ADS_f.P01=0; //配置为数字端口用于判断高低电平

    3,中断的初始化和使用

    初始化

    1. // 初始化外部IO P32
    2. // Gpio_InitIOExt(3,2, GpioDirIn, TRUE, FALSE, FALSE, 0);//输入模式 下拉
    3. // Gpio_SetIO(3, 2, TRUE);//输出高电平,P32使能 外部中断
    4. // 开启GPIO外部中断
    5. // Gpio_ClearIrq(3, 2);//清除中断标志位
    6. // Gpio_EnableIrq(3, 2, GpioIrqLow);//中断设置 P32低电平触发
    7. // EnableNvic(PORT3_IRQn, DDL_IRQ_LEVEL_DEFAULT, TRUE);//中断使能 通道3 第二优先级 每十个引脚一个通道

     中断处理函数

    1. void Gpio_IRQHandler(uint8_t u8Param)//中断服务函数
    2. {
    3. *((uint32_t *)((uint32_t)&M0P_GPIO->P3ICLR + u8Param * 0x40)) = 0;
    4. //内容
    5. Gpio_ClearIrq(3,2);//清除中断标志位
    6. }

    4,ADC初始化和使用

    ADC初始化

    1. stc_adc_cfg_t stcAdcCfg;
    2. stc_adc_norm_cfg_t stcAdcNormCfg;
    3. DDL_ZERO_STRUCT(stcAdcCfg);
    4. DDL_ZERO_STRUCT(stcAdcNormCfg);
    5. if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE))
    6. {
    7. return ;
    8. }
    9. Gpio_SetAnalog(0, 2, TRUE);
    10. Gpio_SetAnalog(3, 5, TRUE);
    11. Adc_Enable();
    12. M0P_BGR->CR_f.BGR_EN = 0x1u;//BGR必须使能
    13. M0P_BGR->CR_f.TS_EN = 0x0u;
    14. delay100us(1);
    15. stcAdcCfg.enAdcOpMode = AdcNormalMode; //单次采样模式
    16. stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1; //PCLK
    17. stcAdcCfg.enAdcSampTimeSel = AdcSampTime12Clk; //4个采样时钟
    18. stcAdcCfg.enAdcRefVolSel = RefVolSelInBgr2p5; //参考电压:内部2.5V(avdd>3V,SPS<=200kHz) SPS速率 = ADC时钟 / (采样时钟 + 16CLK)
    19. stcAdcCfg.bAdcInBufEn = FALSE; //电压跟随器如果使能,SPS采样速率 <=200K
    20. stcAdcCfg.u32AdcRegHighThd = 0u; //比较阈值上门限
    21. stcAdcCfg.u32AdcRegLowThd = 0u; //比较阈值下门限
    22. stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable; //ADC转换自动触发设置
    23. stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
    24. Adc_Init(&stcAdcCfg);
    25. stcAdcNormCfg.enAdcNormModeCh = AdcExInputCH8; //通道8 P02
    26. stcAdcNormCfg.bAdcResultAccEn = FALSE;
    27. Adc_ConfigNormMode(&stcAdcCfg, &stcAdcNormCfg);
    28. stcAdcNormCfg.enAdcNormModeCh = AdcExInputCH5; //通道5 P35
    29. stcAdcNormCfg.bAdcResultAccEn = FALSE;
    30. Adc_ConfigNormMode(&stcAdcCfg, &stcAdcNormCfg);

    使用读取数值

    1. Adc_Start();
    2. while(FALSE != Adc_PollBusyState());
    3. Adc_GetResult(&u16AdcResult);
    4. Adc_ClrAccResult(); //清零累加采样值

  • 相关阅读:
    【Mysql】使用binlog日志进行数据库迁移和数据恢复
    Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理
    tidymodels用于机器学习的一些使用细节
    Netty inEventLoop方法的思想延伸
    第2关:创建表
    如何使用AES128位进行视频解密
    java计算机毕业设计基于安卓Android的校园单车租赁App(源码+系统+mysql数据库+Lw文档)
    【华为HCIP | 职业认证考试】821每日一刷
    06-内核开发-内核态用户态
    轻松掌握JavaScript字符串操作的10个小技巧
  • 原文地址:https://blog.csdn.net/weixin_44110278/article/details/133298307