参考前面介绍的:
HC32_HC32F072FAUA_从零开始搭建空工程模板_江湖上都叫我秋博的博客-CSDN博客
HC32_keil工程的复制_重命名_以及函数、变量定义的正常跳转问题_江湖上都叫我秋博的博客-CSDN博客
复制一个新工程,重命名为ADC, 开启美妙的ADC通信之旅
路径:官网提供的驱动库及样例的压缩包解压后
xxx\hc32f072_ddl_Rev1.1.1\example\adc\adc_sgl_always_sw\MDK\ adc_sgl_always_sw.uvprojx
我们样例代码稍加修改,移植到我们的框架当中。
本代码同时拥有 LED闪烁、UART通信、DAC指定输出以及ADC内部温度传感器测量环境温度的功能。
下面先给出参考手册上面 Page:917- 918需要关注的部分。


代码中主要关注 // ▲
main.c
- #include "ddl.h"
- #include "uart.h"
- #include "gpio.h"
- #include "dac.h"
-
- #include "user_gpio.h"
- #include "user_uart.h"
- #include "user_dac.h"
- #include "user_adc.h"
-
- int32_t main(void)
- {
- // sys_clk_init(); // 系统的时钟初始化 应该放在串口初始化之前 否则系统会出问题
- user_led_init();
- user_uart_init();
- user_dac_init();
- user_adc_init();
-
- while(1)
- {
- if(fpgaRxFlag == 1){ // 当我收到fpga发来的固定长度为8的8个字节以后,我把它发过来的数据,给它回传回去
- send_data_to_fpga(fpgaRx, 8);
- fpgaRxFlag = 0;
- }
-
- if(pcRxFlag ==1 ){
- send_data_to_pc(pcRx, 8);
- pcRxFlag = 0;
- }
-
-
- get_temperature(); // ▲ 本文相关
-
- DAC_OUT = 2048;
- Dac0_SoftwareTriggerCmd();
-
- Gpio_SetIO(LED1_PORT, LED1_PIN);
- Gpio_SetIO(LED2_PORT, LED2_PIN);
-
- delay1ms(500); // while 里面必须有个延迟,不然while(1)把cpu占用了,进不了中断。
-
- Gpio_ClrIO(LED1_PORT, LED1_PIN);
- Gpio_ClrIO(LED2_PORT, LED2_PIN);
-
- delay1ms(500);
-
- }
- }
user_adc.c
- #include "user_adc.h"
- #include "gpio.h"
- #include "bgr.h"
- #include "adc.h"
-
- uint16_t Trim = 0;
- uint32_t u32AdcRestult;
-
- float temperature = 0;
-
- // ADC端口 配置
- void adc_gpio_config(void)
- {
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // 开启ADC/BGR GPIO外设时钟
- Gpio_SetAnalogMode(GpioPortA, GpioPin0); // PA00 (AIN0)
- }
-
- // ADC模块 初始化
- void adc_config(void)
- {
- stc_adc_cfg_t stcAdcCfg;
- DDL_ZERO_STRUCT(stcAdcCfg);
-
- // 开启ADC/BGR外设时钟
- Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
-
- Bgr_BgrEnable(); // 开启BGR
- Bgr_TempSensorEnable(); // ▲【开启温度传感器】
-
- // ADC 初始化配置
- stcAdcCfg.enAdcMode = AdcSglMode; // 采样模式-单次
- stcAdcCfg.enAdcClkDiv = AdcMskClkDiv1; // 采样分频-1
- stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; // 采样周期数-12
- stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelInBgr2p5; // 参考电压选择-内部2.5V
- stcAdcCfg.enAdcOpBuf = AdcMskBufEnable; // ▲ OP BUF配置-开
- stcAdcCfg.enInRef = AdcMskInRefEnable; // 内部参考电压使能-开
- stcAdcCfg.enAdcAlign = AdcAlignRight; // 转换结果对齐方式-右
- Adc_Init(&stcAdcCfg);
- }
-
- // ADC 单次采样模式 配置
- void adc_sgl_config(void)
- {
- // 配置单次采样通道
- Adc_CfgSglChannel(AdcAiTsInput);
-
- // 启动单次一直采样
- Adc_SGL_Always_Start();
- }
-
-
- void user_adc_init(void){
- adc_gpio_config();
- adc_config();
- adc_sgl_config();
- }
-
- void get_temperature(void){
-
- if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl))
- {
- // 获取采样值
- Trim = *((uint16_t *)(0x00100C36)); // ▲ 2.5V对应的地址
- u32AdcRestult = Adc_GetSglResult();
- temperature = 25 + 0.2135 * (float)(u32AdcRestult - Trim );
- // ▲ 0.2135 = 0.0854 ×2.5
- Adc_ClrIrqStatus(AdcMskIrqSgl);
- }
- }
user_dac.h
- #ifndef _USER_ADC_H_
- #define _USER_ADC_H_
-
- #include "ddl.h"
-
- extern float temperature;
- extern uint16_t Trim;
- extern uint32_t u32AdcRestult;
-
- void adc_gpio_config(void);
- void adc_config(void);
- void adc_sgl_config(void);
- void user_adc_init(void);
- void get_temperature(void);
-
- #endif
-
读出的环境温度被保存到了全局变量 temperature 中,在线断点调试可以添加到watch中查看。

感谢您的阅读,欢迎留言讨论、收藏、点赞。