keil5芯片包安装失败_Keil开发SWM320芯片的入门教程

本人非常荣幸成为芯吧客社区首批评测松果派One的用户,也感谢松果派社区给我带来这个好玩的小板子。松果派One的主控芯片是国产ARM Cortex-M4,型号为SWM320,来自华芯威特(synwit)。

在不久前,我们已经对松果派One做了初步的评测,但是只测试了MicroPython的开发。详情见本人上一篇大作《松果派ONE,基于国产ARM Cortex-M4》

对于初级爱好者,MicroPython是个非常容易上手的编程环境。然而,大多数老司机还是喜欢用c语言开发的,他们使用使用keil作为IDE,真的好高大上啊。各位正在用MicroPython的小伙伴们是否也想学学keil开发呢?今天,机会来了,我们要做一个小小的教程,展示一下SWM320芯片的Kei开发。

Keil从5.0版本之后通过安装对应单片机的pack提供对芯片的支持,安装Synwit.SWM32_DFP.1.0.0.pack后在Keil 5中新建工程可以直接选择Synwit SWM系列芯片,且软件会根据所选型号自动正确设置Flash/RAM大小、程序烧写算法、SVD仿真文件等内容。安装方法很简单,点击工具栏“Pack Installer”按钮 ,在弹出窗口中通过菜单“File->Import..”选中Synwit.SWM32_DFP.1.0.0.pack,点击“打开”按钮就安装了。

这是篇入门教程,既然涉及到硬件相关(点灯),那么硬件电路是有必要介绍一番,虽然点灯的硬件是再简单不过了。我们把一个LED与电阻串联后接在A0引脚与GND之间。当程序初始化A0引脚为输出并设置为高电平以后,A0引脚与GND之间会产生一个3.3V电压。注意图中LED的方向,LED是有极性的,正向导通时候才能发光。另外,为了保护LED(也对SWM320好),我们加了一个100欧的限流电阻。d22d1519fbdf2bb30b4be40827619f49.png
   这个限流电阻的估算方式是这样的:当一个LED与电阻串联的电路两端加载3.3V电压以后;假设电阻分压1.5V(我们这次用的这个LED的正向压降约等于1.8V,则电阻分压为3.3-1.8=1.5V);一般来说,LED的电流设置在5~20毫安都是可以的,15毫安时候就可以把LED点得比较亮了;因为LED与电阻是串联关系,电阻上的电流也是15毫安(即0.015安);假设前面这些条件成立,可推算电阻的阻值为100欧(1.5/0.015=100欧)。

下面,让我们打开Keil,开始今天的教程吧。我给这个教程取名为“定时HelloWorld”,即:定时器触发的GPIO翻转和串口输出

SWM320的函数封装与STM32是相似的,如果您已经玩过STM32,今天这个教程学起来应该是势如破竹的,不会遇到任何挫折。

首先,新建SWM320工程,新建一个main文件,如下图所示:ab6b0dc153f9394a9991c9f8304a1466.png
与过去的STM32程序一样,SWM320也需要引用自己的头文件,文件名叫SWM320.h,然后你就可以使用SystemInit或GPIO_Init这样的函数了。

其中,GPIO_Init函数控制引脚方向、上拉电阻和下拉电阻。GPIO_Init函数第一个输入变量指定GPIO端口,有效值包括GPIOA,GPIOB,GPIOC,GPIOM,GPION,GPIOP。如果我们想控制A0,这个输入变量要赋值GPIOA。第二个输入变量指定GPIO引脚,有效值包括PIN0,PIN1,PIN2等等。我们想控制A0,所以这个输入变量要赋值PIN0。第三个输入变量定义引脚方向,0输入,1输出。我们要输出高电平点灯,所以这个变量要赋值1。第四个输入变量定义上拉电阻,0关闭上拉,1开启上拉。我们点灯不要上拉电阻,所以要赋值0。第五个输入变量控制下拉电阻,0关闭下拉,1开启下拉。我们点灯也不要下拉电阻,所以这个变量要赋值0。

另外,当需要使用串口时,我们习惯上会新建一个串口初始化函数SerialInit(void),定义串口引脚和波特率。下面这个函数,定义串口为A2和A3引脚,定义串口波特率38400:

0dc9ef6fe21379e505b963fff3c57170.png

SWM320的很多GPIO引脚除了数字GPIO功能,还支持FUNx配置功能,奇数的GPIO引脚GPI支持FUNA功能,偶数的GPIO引脚支持FUNB功能,除了A12/B12/N18/N19无FUNx配置功能。FUNA功能的引出脚可以通过重映射从任意一个支持FUNA的管脚引出;FUNB功能也是一样。9f0562bd3774528f801412a53c517d16.png
   这可以给你们的项目带来更高的容错率。比如,有一天,某个不靠谱的硬件工程小白做PCB把串口或I2C管脚给引错了,先不要着急烧掉PCB跑路,交给程序小哥看看,也许还能补救一下。如果需要串口TXD或I2C SDA的引脚虽然引错了但正好在支持FUNA的管脚上,且需要串口RXD或I2C SDC的引脚也引在支持FUNB的管脚上了,那你们的项目还有救!c3173571137a2869285a4e66aa45ffcc.png
       扯远了,小伙伴们,我们收!继续说说串口初始化函数里面的细节。(下面这段话,小伙伴们不用死抠里面的细节,串口初始化之所以封装成函数就是为了方便大家直接拷贝过去用的)
为了用UART_Open函数打开UART0(串口0),先要用UART_Init函数初始化UART0。UART_Init函数有两个输入变量,第一个是串口0的寄存器地址(APB_BASE + 0x10000)。UART_Init函数第二个变量是个结构体变量,包含10个子变量:

第1个子变量是波特率,是个32位变量,

第2到第10个子变量都是8位的;第2子变量是数据位数,可取值UART_DATA_8BIT或UART_DATA_9BIT;

第3子变量是奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、UART_PARITY_ZERO;

第4子变量是停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT;

第5个RXThreshold代表RX FIFO大于多少个数据出发中断,可取值0-7,它只有在第6个RXThresholdIEn被启用(设为1)时才起作用,这里我们不启用该中断;

第7和第8是TX中断控制,与RX相反的是,TX中断的触发机制是TX FIFO中数据小于TXThreshold时触发中断。

第9和第10分别是Timeout超时时间和是否启用超时中断。

以上这几个中断我们都没用到。我们设计用A3和A2作为UART0的TX和RX管脚,于是用PORT_Init函数设置引脚功能。其中,偶数的A2管脚可以使用FUNMUX0里的功能,作为UART0的RXD引脚;奇数的A3管脚可以使用FUNMUX1里的FUNMUX1_UART0_TXD。PORT_Init函数输入变量由3个,第1个变量指定PORT端口,第2个指定PORT引脚,第3个指定端口引脚要设定的功能,第4个数字输入使能。有一个注意事项,当引脚编号为偶数时只能用FUNMUX0(FUNB),奇数的话就只能用FUNMUX1(即FUNA),另外A12/B12/N18/N19无FUNx配置功能。

串口打印时,我们如果想使用printf函数,可以把fputc重定向一下7088140145e350f605613d6a12c1060f.png

接着,我们一起写一下main函数。必须先完成SystemInit函数的初始化,才能对串口进行初始化、GPIO初始化,或定时器初始化。GPIO初始化与定时器初始化之间,本身并没有先后的必要性,但是我们今天的这个程序例子要定时触发GPIO翻转和串口输出,为了提高程序的稳定性,我们先把串口和GPIO完成初始化,然后再初始化定时器。我们可以想象得到,当定时器被初始化以后,定时触发函数就会每隔固定间隔被触发一次,而串口输出和GPIO操作的代码是在触发函数里的;如果串口和GPIO初始化函数的执行速度比较慢,还没完成初始化,但是定时触发函数已经开始执行了,就会对程序的稳定性造成影响;所以我们要尽量规避这种隐藏的BUG。我们的Main函数代码如下图所示:ca4629ae730b15aef92c65e377f6d535.png
    其中,当完成串口初始化以后,先打印Hello World输出调试信息。然后把A0引脚设置为输出(该引脚接了LED)。初始化定时器0,每隔0.5秒触发一次,然后把定时器打开。

然后,是定时器0的触发函数,每隔0.5秒进入一次。我们把需要的操作写进去,分别是A0引脚电平翻转和串口打印“TogglePin”ac54853aa6836a32328b1aa7d41b1ca8.png

有心急的已经坐不住了,要点build按钮编译了.......

7f84ff31ef7f98dd4733dc9512f475a6.gif

点“阅读原文”,查阅完整教程!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值