本文的诞生源自于某个无良商家把CS32F103X当STM32F103X卖。。。
问题发现:
换了台新电脑,从官网重新安装了keil,下载时提示
“Connection refused due to device mismatch!”
查找问题:
这里直接跳过一段繁琐的过程,总之找到了一篇提出并解决了这个问题的文章:
https://zhuanlan.zhihu.com/p/347463935
总结来说,新的keil平台识别出了“盗版芯片”的芯片号,与stm32的芯片号不匹配,于是下载失败。
本文的作者通过查找芯片号找到了实际的芯片是CS32F103X。
解决方法是,下载该芯片的PACK,然后把头文件以及路径都换一下。
这个解决方式还算是方便的,我查找了一下这个芯片的数据手册,发现它的资源和架构大部分和STM32是重合的,这也是为什么在之前低版本keil下载能把stm32的代码下进cs32里。
也就是说,大部分(我还没都试过)原本的STM32F103X的代码除了头文件不一样,其他都是可以直接cv的。
一些添砖加瓦的工作:
当下载完CS32的pack后,可以直接引入头文件 #include<cs32f10x.h>,这里一般不会报错。
然后写一个简单的主函数(可以简单定义个变量),直接编译,之后应该会报错。
如果报错的是.h 文件,可以直接把文件名复制下来,去一个叫Keil_V5的文件夹搜索
那个Keil_V5是存放arm的pack和软件的地方。
大致长得像这样。
如果你已经下载完成了cs的pack,可以试着去这个地址
"......\Keil_V5\ARM\PACK\Keil\CS32F1xx_DFP\1.0.0"
然后开始文件搜索。
找到对应的文件后,复制文件路径,放进keil的文件路径中。
点开图里的那个魔术棒,弹窗点击C/C++,在这个界面的下面有个include path。
在这个界面添加。
添加完所有文件后,我们还需要添加一个.s文件。(图中startup_cs32f10x_md.s)
。
这个大家也可以通过找文件的方式找到,需要说明的是,这个文件是基于单片机容量编写的启动文件,大家应该根据实际单片机容量选择(我这里随便挑了一个)。
找到这个文件后我们可以直接把它复制在我们的工程下面(和我们的主函数待一块),然后去Keil双击Source Group1将它添加。
最后,我还碰到一个问题,它的报错大概是这么说的“Undefined symbol SystemInit”
我查了一下原因,没太看明白,希望有大佬能指点一下,不过我找到的一个解决方法是,用txt打开启动文件把这么几句话注释掉(先去属性里把“只读”关掉)
从“IMPORT”到“BLX R0”。这里是汇编,注释用“;” 。
最后再编译一下,应该就能运行了。
#include <cs32f10x.h>
#define PAout(n) GPIOA->ODR ^= 1 << n;
int main()
{
unsigned int i, j;
RCC->APB2ENR = 1 << 2;
GPIOA->CRL &= 0XFFFFFF0F;
GPIOA->CRL |= 0X00000030;
//unsigned int i,j; //声明不可在可执行语句后面(进函数前声明变量)C89标准//可以修改
while (1)
{
PAout(1);
i = 400;
while (--i)
{
j = 1000;
while (--j);
}
PAout(1);
i = 400;
while (--i)
{
j = 1000;
while (--j);
}
}
}
一个简单的亮灯程序,测试一下下载效果,记得去debug勾选“Reset and Run”