打印
[AT32 WorkBench]

AT32 WorkBench常用功能49--AT32F403A TMR比较事件触发ADC普通组转换配置

[复制链接]
1171|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ArterySW|  楼主 | 2025-4-16 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AT32 WorkBench常用功能49--AT32F403A TMR比较事件触发ADC普通组转换配置

本文主要介绍如何基于AT32 WorkBench配置TMR比较事件触发ADC普通组转换,转换多个通道,并通过DMA读取转换的数据
转换时序

硬件环境
  • AT-START-F403A

软件环境
  • AT32 Workbench
  • MDK5
  • 串口助手


配置步骤
1打开AT32WorkBench新建AT32F403A工程


2配置系统时钟(如果使用默认内部HICK,跳过此步骤2)
2.1 打开外设CRM配置HEXT为时钟振荡器,如下图


2.2 打开时钟配置


3配置普通组转换ADC CH1(PA1引脚)、ADC CH2(PA2引脚)、ADC CH3(PA3引脚)


4 配置DMA通道


5配置TMR1
5.1开启TMR1_CH1


5.2配置TMR1相关参数


6配置串口打印
6.1配置USART1


6.2 USART1引脚配置成PA9


6.3 开启串口打印


7点击“生成代码”生成MDK5代码工程

8配置ADC普通通道转换相关应用代码
main.c的mian函数写法如下, 可以直接替换这部分代码

int main(void)
{
  /* add user code begin 1 */
  uint16_t adc_odt[3];
  /* add user code end 1 */

  /* system clock config. */
  wk_system_clock_config();

  /* config periph clock. */
  wk_periph_clock_config();

  /* nvic config. */
  wk_nvic_config();

  /* timebase config. */
  wk_timebase_init();

  /* init dma1 channel1 */
  wk_dma1_channel1_init();
  /* config dma channel transfer parameter */
  /* user need to modify define values DMAx_CHANNELy_XXX_BASE_ADDR and DMAx_CHANNELy_BUFFER_SIZE in at32xxx_wk_config.h */
  wk_dma_channel_config(DMA1_CHANNEL1,
                        (uint32_t)&ADC1->odt,
                        (uint32_t)adc_odt,
                        3);
  dma_channel_enable(DMA1_CHANNEL1, TRUE);

  /* usart1 already supports printf. */
  /* init usart1 function. */
  wk_usart1_init();

  /* init adc1 function. */
  wk_adc1_init();

  /* init tmr1 function. */
  wk_tmr1_init();

  /* add user code begin 2 */
  while(dma_flag_get(DMA1_FDT1_FLAG) == RESET);
  /* add user code end 2 */

  while(1)
  {
    /* add user code begin 3 */
    printf("adc data  pa1:%d  pa2:%d  pa3:%d\r\n", adc_odt[0], adc_odt[1], adc_odt[2]);

    wk_delay_ms(1000);
    /* add user code end 3 */
  }
}
9将ADC引脚接以下电压,
ADC CH1(PA1引脚)接3.3V
ADC CH2(PA2引脚)接1.6V
ADC CH3(PA3引脚)接0V

10在MDK5上编译,并下载代码到AT32F403A MCU 上

11复位运行AT32F403A MCU,用串口助手观看打印信息,ADC数据会每10ms通过TMR_CH1比较事件触发转换一次,AD值每1秒钟通过串口打印一次


AT32 WorkBench常用功能49--AT32F403A TMR比较事件触发ADC普通组转换配置.zip

772.63 KB

使用特权

评论回复
沙发
暗夜幽灵骑士| | 2025-4-19 14:55 | 只看该作者
这个教程很详细,按照步骤来可以很容易地实现TMR比较事件触发ADC转换,感谢分享!

使用特权

评论回复
板凳
zhjb1| | 2025-4-20 09:10 | 只看该作者
谢谢,尝试您的方法

使用特权

评论回复
地板
zhjb1| | 2025-4-20 09:49 | 只看该作者
您好!说明清晰明白,我的工程稍有不同,工程设置好后,我的DMA默认为DMA1——CHAANNEL7,我将您的:
wk_dma_channel_config(DMA1_CHANNEL1,(uint32_t)&ADC1->odt,(uint32_t)adc_odt,3);改成
wk_dma_channel_config(DMA1_CHANNEL7,(uint32_t)&ADC1->odt,(uint32_t)adc_odt,6);//分别1-4ADC,测温,测压
好像这个应该没有问题。
比如您用TIM1触发ADC1,我想用软件触发,查看at32f403a_407_adc文档,里面只有一个函数与dma有关,没有如何启动DMA的函数就像STM中的HAL_ADC_Start_DMA(...)语句一样,ATBenchMark中设置了软件启动,在编程中如何软起动呢?
希望回复解答,如果需要什么币之类的,有可以给,我无用。
谢谢

使用特权

评论回复
5
骑着蜗牛狂奔O| | 2025-4-21 10:28 | 只看该作者
zhjb1 发表于 2025-4-20 09:49
您好!说明清晰明白,我的工程稍有不同,工程设置好后,我的DMA默认为DMA1——CHAANNEL7,我将您的:
wk_dm ...

软件触发参考这个帖子

https://bbs.21ic.com/icview-3446700-1-1.html
AT32 WorkBench常用功能34--AT32F403A ADC普通组转换多通道配置(序列模式,用DMA)

使用特权

评论回复
6
zhjb1| | 2025-4-22 09:34 | 只看该作者
本帖最后由 zhjb1 于 2025-4-22 09:37 编辑
骑着蜗牛狂奔O 发表于 2025-4-21 10:28
软件触发参考这个帖子

https://bbs.21ic.com/icview-3446700-1-1.html

您好!非常感谢回复。
实际上我从那个栏目里的32-37(42-47也都下载了)都下载转成txt文档,按照上边的进行测试了。结果都不出来——printf打印结果都为0.只有我发的这个采用的案例输出了数据尽管不对——因为外接电位器调整电压不动。
我手里有2.0.1、2.1.4等官方工程,将里面的代码复制过来不行——明知不行也要试,让人觉的非常可笑。
目的就是想利用好这个开发工具。
再次感谢回复。
顺带说一下我的keil是5.25版的,机器里还有5.38,最低还有4.12,IAR是8.32因为没有器件包,没有用IAR。
补充一点:我用STM32F401RCT6做过相同工程,所有功能都能实现。只是在测试ATBS时遇到困难。

使用特权

评论回复
7
星空魔法师| | 2025-4-25 10:12 | 只看该作者
这个教程很详细,对于AT32F403A的TMR比较事件触发ADC转换配置步骤讲解得很清楚,适合新手学习。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

198

主题

302

帖子

16

粉丝