[IDE] 请问1.42版本中ADC寄存器是否已经定义?自己定义一下行吗?

[复制链接]
 楼主| panxiaoyi 发表于 2021-5-12 01:45 | 显示全部楼层 |阅读模式
请问在 MounRiver Studio 1.42 版本中,编译 ADC->CTLR1=0; 出错,我尝试过包含很多头文件都不行,请问这些ADC寄存器是否已经定义了?我下面以 “IO口寄存器” 为例,尝试自定义,编译和实际运行都正常,请问这样定义可以吗?取名是否规范?格式是否规范?谢谢


  1. #include "ch32v10x.h"

  2. #define  B7_H  GPIOB->OUTDR|=1<<7                            //高电平,驱动LED闪烁
  3. #define  B7_L  GPIOB->OUTDR&=~(1<<7)                         //低电平

  4. #define  R32_GPIOB_CFGLR  (*(unsigned long *)0x40010C00)     //请问这样自定义行不行?是否规范?

  5. unsigned long u16a;

  6. int main(void)
  7. {
  8.     RCC->CTLR   = 0x00000081;                                //使能内部HSI振荡器8MHz,时钟微调默认

  9.     //ADC->CTLR1=0;                                          //此语句编译出错 !!!

  10.     RCC->APB2PCENR  |= 8;                                    //使能PB端口时钟
  11.     GPIOB->CFGLR    &= 0x0FFFFFFF;                           //清空位PB7

  12.     //GPIOB->CFGLR    |= 0x30000000;                         //位PB7推换输出,最快50MHz
  13.     R32_GPIOB_CFGLR |= 0x30000000;                           //测试用此语句代替上面这条

  14.     while(1)
  15.     {
  16.         B7_H;
  17.         for(u16a=0; u16a<3000000; u16a++) asm("nop");

  18.         B7_L;
  19.         for(u16a=0; u16a<3000000; u16a++) asm("nop");
  20.     }
  21. }


 楼主| panxiaoyi 发表于 2021-5-12 01:51 | 显示全部楼层
其实我也想用库函数,只是,我的英语很差,要学懂和运用好这些库函数也很困难,对我来说还不如看数据手册直接操作寄存器来的快,请问这种方法是不是太老土了?
 楼主| panxiaoyi 发表于 2021-5-12 08:08 | 显示全部楼层
根据系统提示
ADC->CTLR1=0;
更改成
ADC1->CTLR1=0;
编译通过。
还有,我也看了其它模块的寄存器是否也有这种编译不通过的现象,发现也有一些,如下面的
  1.     DMA->MADDR7=0;
  2.     TKEY_V->CTLR=0;
  3.     USBD->EPR7=0;
  4.     UHOST->CTRL=0;
  5.     CAN->BTIMR=0;
  6.     ESIG->FLACAP=0;
请问,要怎样表达才能正确的读写寄存器?谢谢

 楼主| panxiaoyi 发表于 2021-5-12 08:50 | 显示全部楼层
原来自定义寄存器后,不用包含任何头文件也可以,程序运行正常,有点好玩,就是格式不知道是否规范?真诚的希望大家能指点一下

  1. //没有包含任何头文件

  2. #define  R32_GPIOB_CFGLR   (*(unsigned long *)0x40010C00)    //请问这样自定义行不行?是否规范?
  3. #define  R32_RCC_APB2PCENR (*(unsigned long *)0x40021018)
  4. #define  R32_RCC_CTLR      (*(unsigned long *)0x40021000)

  5. #define  R32_GPIOB_OUTDR   (*(unsigned long *)0x40010C0C)

  6. #define  B7_H  R32_GPIOB_OUTDR |= 1<<7                       //高电平,驱动LED闪烁
  7. #define  B7_L  R32_GPIOB_OUTDR &= ~(1<<7)                    //低电平

  8. unsigned long u32a;

  9. int main(void)
  10. {
  11.     R32_RCC_CTLR       = 0x00000081;                        //使能内部HSI振荡器8MHz,时钟微调默认

  12.     R32_RCC_APB2PCENR |= 8;                                 //使能PB端口时钟
  13.     R32_GPIOB_CFGLR   &= 0x0FFFFFFF;                        //清空位PB7
  14.     R32_GPIOB_CFGLR   |= 0x30000000;                        //位PB7推换输出,最快50MHz

  15.     while(1)
  16.     {
  17.         B7_H;
  18.         for(u32a=0; u32a<3000000; u32a++) asm("nop");

  19.         B7_L;
  20.         for(u32a=0; u32a<3000000; u32a++) asm("nop");
  21.     }
  22. }


 楼主| panxiaoyi 发表于 2021-5-12 08:53 | 显示全部楼层
对于这个自定义,我也是依葫芦画瓢。

在写 STC8A8K64S4A12 的 IIC 程序时,发现 STC8.h 没有定义  I2CMSAUX 这个寄存器,自己定义了一下,下面最后那行就是我添加的,不知可否,还要测试一下

#define I2CSLADR    (*(unsigned char volatile xdata *)0xfe85)
#define I2CTXD      (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD      (*(unsigned char volatile xdata *)0xfe87)
#define I2CMSAUX      (*(unsigned char volatile xdata *)0xfe88)
xdqfc 发表于 2021-5-12 09:38 | 显示全部楼层
寄存器绝对地址定位,就是楼主这样做的,就是不要把数据弄错了就可以,之前华大单片机的库烂的一B,我就重新做了寄存器绝对定位。
xdqfc 发表于 2021-5-12 09:41 | 显示全部楼层
panxiaoyi 发表于 2021-5-12 08:08
根据系统提示
ADC->CTLR1=0;
更改成

去对应的外设库看一下,那边有正确的写法,看样子做外设库的工程师是不是心不仔细哈。
 楼主| panxiaoyi 发表于 2021-5-12 10:53 | 显示全部楼层
百度了一下,好像是要像5楼一样,加上 volatile 好一点,修改后就是 (*(unsigned long volatile *)0x40010C00),编译和运行正常
WCHTech2 发表于 2021-5-17 17:02 | 显示全部楼层
1893860a230e8dabd7.png 看ch32v10x.h头文件的定义
xdqfc 发表于 2021-5-18 09:31 | 显示全部楼层
本帖最后由 xdqfc 于 2021-5-18 15:45 编辑
WCHTech2 发表于 2021-5-17 17:02
看ch32v10x.h头文件的定义



ADC1_BASE=APB2PERIPH_BASE + 0x2400=(PERIPH_BASE + 0x10000)+0x2400=0x40000000+ 0x10000+0x2400=0x40012400

gejigeji521 发表于 2021-5-31 21:31 | 显示全部楼层
找不到的时候可以在头文件中找找看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

414

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

53

主题

414

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部