[IDE]

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

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


#include "ch32v10x.h"

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

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

unsigned long u16a;

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

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

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

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

    while(1)
    {
        B7_H;
        for(u16a=0; u16a<3000000; u16a++) asm("nop");

        B7_L;
        for(u16a=0; u16a<3000000; u16a++) asm("nop");
    }
}


使用特权

评论回复

相关帖子

panxiaoyi|  楼主 | 2021-5-12 01:51 | 显示全部楼层
其实我也想用库函数,只是,我的英语很差,要学懂和运用好这些库函数也很困难,对我来说还不如看数据手册直接操作寄存器来的快,请问这种方法是不是太老土了?

使用特权

评论回复
panxiaoyi|  楼主 | 2021-5-12 08:08 | 显示全部楼层
根据系统提示
ADC->CTLR1=0;
更改成
ADC1->CTLR1=0;
编译通过。
还有,我也看了其它模块的寄存器是否也有这种编译不通过的现象,发现也有一些,如下面的
    DMA->MADDR7=0;
    TKEY_V->CTLR=0;
    USBD->EPR7=0;
    UHOST->CTRL=0;
    CAN->BTIMR=0;
    ESIG->FLACAP=0;
请问,要怎样表达才能正确的读写寄存器?谢谢

使用特权

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

//没有包含任何头文件

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

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

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

unsigned long u32a;

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

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

    while(1)
    {
        B7_H;
        for(u32a=0; u32a<3000000; u32a++) asm("nop");

        B7_L;
        for(u32a=0; u32a<3000000; u32a++) asm("nop");
    }
}


使用特权

评论回复
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 | 显示全部楼层
找不到的时候可以在头文件中找找看。

使用特权

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

本版积分规则

47

主题

384

帖子

2

粉丝