[XMG助力国产生态]
@XMGroupe.
此贴记录了拿到核心板使用至今踩过的一些坑。
----------------------------------------------
0、IO口的常见配置在工程的GPIO_GPCOM_TIMER_Example.c文件中,一些常见操作可以参考或修改参数直接使用,如果不小心将其加入到了编译。只需要在对应.c文件上右键 点击 Include/Exclude From Build即可。
1、设置IO COM模式后,如果想要使用GPIO_GET_INPUT_VALUE_SAFE来读取IO的电平,需要同时使能COM对应的GPIO时钟
例如:
INTDEV_SET_CLK_RST(COMx,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV8));
此处没有使能GPIOx_BASE_ADDR的时钟,
此时使用GPIO_GET_INPUT_VALUE_SAFE读取对应IO电平将得到全0值,
但是GPIO_GET_INPUT_VALUE_FAST可以正常使用。
INTDEV_SET_CLK_RST(COMx,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV8));
INTDEV_SET_CLK_RST(GPIOx_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV8));
此处使能了GPIOx_BASE_ADDR的时钟,
此时使用GPIO_GET_INPUT_VALUE_SAFE和GPIO_GET_INPUT_VALUE_FAST均可读取对应IO电平。
2、使用GPIO_GET_INPUT_VALUE_XXXX读取的电平返回值是十六位无符号,请注意被赋值变量的位数是否合理。
3、MC3172.h文件中第212行存在一处bug,应修改为
#define GPIO_GET_INPUT_VALUE_FAST(GPIO_SEL) (*(volatile u16*)(GPIO_SEL+GPIO_READ_REAL_INPUT_VALUE_ADDR))
4、GPIO_SET_OUTPUT_PIN_VALUE用来设置IO的输出电平,其mask表示指定的IO口,value为16位输入,不要直接对value赋1或0进行设置
错误范例
GPIO_SET_OUTPUT_PIN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN4,1);//A4设置为高电平
此处value值为0x0001,对应二进制 0000 0000 0000 0001,pin4为0
正确设置
GPIO_SET_OUTPUT_PIN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN4,0x0010);//A4设置为高电平
5、有些功能需要IO口输入输出功能,参照51单片机,此处不必纠结太多,当需要在输入或输出切换时,只需要在对应的input函数或set函数前面加一句
GPIO_SET_OUTPUT_EN_VALUE(GPIOx_BASE_ADDR,GPIO_PINx,GPIO_SET_ENABLE);
GPIO_SET_INPUT_EN_VALUE(GPIOx_BASE_ADDR,GPIO_PINx,GPIO_SET_ENABLE);
即可。
6、外设速度与线程速度无关,在设置对应的外设COMx时,时钟分频是以系统主时钟进行分频的,与线程的频率无关,例如系统主时钟采用内部高速RC 192MHz,则在对COMx进行分频时,其分频基准为192M,与线程的1/4 1/8...无关。
7、断开USB线和核心板连接前,应先在烧写软件中进行断开连接操作,否则重新插入后烧写程序会无响应闪退。
*个人见解,不代表官方,如果有错误或描述不恰当的地方,欢迎官方和各位大佬批评指正。
*后面遇到新的坑会持续更新,
离线
太厉害了
离线
8、使用多个线程刷新显示屏时,需要加入一个刷新忙碌标志位,否则屏幕会乱码。
离线
9.底层的TIMER_GET_MAIN_CNT_RP函数有bug,返回值为2和3,官方技术推荐使用TIMER_GET_MAIN_CNT_ALL函数替代TIMER_GET_MAIN_CNT_RP和TIMER_GET_MAIN_CNT_ALL
//推荐使用这个
#define TIMER_GET_MAIN_CNT_ALL(TIMER_SEL,main_cnt,main_cnt_rp) main_cnt = (*(volatile u32*)(TIMER_SEL+0x12*8));\
main_cnt_rp = main_cnt>>24;\
main_cnt = main_cnt&0x00ffffff
//有bug
#define TIMER_GET_MAIN_CNT_RP(TIMER_SEL,main_cnt_rp) main_cnt_rp = (*(volatile u8*)(TIMER_SEL+0x11*8))
#define TIMER_GET_MAIN_CNT(TIMER_SEL,main_cnt) main_cnt = (*(volatile u32*)(TIMER_SEL+0x10*8))
离线