|
本帖最后由 bigfanofloT 于 2016-11-3 14:50 编辑
之前写过使用STM32CubeMX配置STM32F410RB Nucleo-64和STM32L432KCU6 Nucleo-32然后连接机智云服务器的教程,经反馈部分G友表示对STM32CubeMX不太熟悉,为了照顾新手,这里写一篇gokit使用STM32CubeMX配置然后连接机智云服务器的教程。本文的重点在于如何使用STM32CubeMX以及调试的方法,关于移植驱动程序和机智云生成的协议在另外一篇帖子已详细说明。
本文的案例是:
硬件:
机智云STM32底板Gokit V2.1
机智云功能扩展板Gokit V2.3
Micro USB线
STlink(用于下载代码,没有的可以使用串口下载方式)
软件工具:
STM32CubeMX
Keil
串口调试助手
功能描述:
实现了一个智能全彩灯应用,手机APP远程控制扩展板上RGB LED的颜色,有3种预定义颜色(黄色、紫色、粉色)和自定义模式,自定义模式下可以任意设置RGB LED的颜色值,有255*255*255种颜色组合。
本文将详细说明如何使用STM32CubeMX配置Gokit上的MCU(STM32F103C8T6)连接机智云服务器所必须的三点,以及必要外设的配置。
一、系统结构
如下为本例程的系统结构,微控制器和WIFI模组之间是串口透传,WIFI模组已烧录机智云GAgent固件,电源部分未画出。
通过机智云自助开发平台可以帮助用户生成测试手机APP(支持安卓和IOS),我们定义好数据点后可以生成MCU方案和SOC方案的工程模板,生成的工程模板包含了与产品有关的文件和与串口通信协议有关的文件,这些可以直接拿来用或者仅需微小的改动,我们需要做的是编写应用逻辑代码,基于此案例就是RGB LED的驱动程序,以及按键驱动,和应用逻辑(即MCU收到WIFI发来的指令数据后干什么)。
通过对机智云生成的工程框架的了解,我们要想把MCU通过WIFI模组连接机智云必须需要实现以下3个接口:
1.串口发送1个字节;
2.串口中断方式接收1个字节;
3.定时器1ms中断,作为MCU和WIFI模组的心跳;
4.触发WIFI模组联网(这里通过按键触发WIFI模组连接路由器进而连接机智云服务器)
二、开始配置
1.先确定使用MCU的引脚和外设
通过Gokit原理图(文末有附件)确定的资源分配如下:
串口1:用于调试打印日志;
串口2:用于和WIFI模组通信;
定时器3:1ms中断,用于MCU与WIFI模组的心跳;
定时器2:1ms中断,用于按键扫描;
RGB LED灯:
电源控制---PA0
SDA---PB9
SCL---PB8
按键:
key1---PB10
key2---PA8
底板红色LED1---PB15(这个LED的用途后面会提到)
2.使用STM32CubeMX配置上述GPIO和外设
这里会详细描述STM32CubeMX的使用,体验到它的强大方便之处。(1)打开STM32CubeMX后,选择MCU型号;
按图示步骤新建工程,选择MCU型号为STM32F103C8T6;
(2)时钟配置,STM32F103系列系统时钟最大72MHz;
由于Gokit上焊接了外部8MHz晶振,因此这里选择使用外部晶振;
按图示选择时钟源,9倍频,最后系统时钟为72MHz;
(3)SWD调试
没有仿真器的可以不必选择使用SWD接口,跳过此步,使用串口下载程序即可;
(4)GPIO的配置
控制RGB LED的3个管脚,连接按键的2个管脚,底板红色LED1的管脚;
鼠标放到需要配置的管脚上,点击右键即可弹出选择框,如上图,PA0是RGB LED的电源开关控制管脚,我们配置它为输出模式;
同样的RGB LED 的SDA(PB9)、SCL管脚(PB8)配置为输出模式,底板红色LED1管脚(PB15)配置为输出模式,按键key1(PB10)、
key2(PA8)配置为输入模式;
PA0配置为:默认输出低电平、推免输出模式、输出速度为高、用户标签为RGB_EN,这里用户标签后面编程会用到,可以按照C语言标识符命名原则自由选择;
底板红色LED1管脚PB15的配置:默认输出低电平、推免输出模式、输出速度为高、用户标签为LED1;
按键key2管脚PA8配置为上拉输入(结合原理图理解即可),用户标签为Key2,;
最后配置好GPIO如上图:
(5)串口外设配置
串口1和串口2除了波特率不同,以及串口2是中断接收外,其它配置都相同;
勾选使能串口1和2,选择异步模式Asynchronous;
串口2与WIFI模组通信,必须配置为9600波特率,8位数据,无优先级,1位停止位,开启发送和接收模式;
串口2开启全局中断;
同样串口1用于调试打印日志用,无需中断,配置为115200波特率;
(6)定时器外设配置
配置定时器3为1ms中断,作为MCU和WIFI模组的心跳,定时器2为1ms中断用于按键定时扫描;
首先开启定时器2和3外设;
配置定时器2为1ms中断,由于定时器时钟前面配置为72MHz,我们选择分频系数为71、向上计数模式、重载寄存器值为999,则定时到72/(71+1)us *(999+1)=1ms溢出进入中断服务程序;
开启中断;
同样的将定时3配置为1ms中断;
至此完成了时钟、GPIO和外设的配置;
(7)STM32CubeMX工程的保存
点击菜单栏保存按钮将弹出上图对话框,依次填写工程名字、选择工程存放目录、选择开发工具(这里选择keil MDK);
在代码生成选项卡,选择勾选为每个外设生成独立的.c和.h文件;
最后在菜单栏有生成工程按钮(1)和生成PDF报告按钮(2),点击生成工程按钮即可生成工程,生成完毕会提示是否打开工程,生成PDF报告的作用是:生成工程信息、时钟配置、IO配置、外设配置、功耗估算等信息的PDF文档;
三、初步调试
前面生成了工程,使用keil(keil需安装好STM32开发环境,若没安装请参考社区教程)打开如下:
绿色方框为符合CMSIS标准的文件,蓝色为启动文件,黄色为HAL外设库函数,红色为用户文件,我们主要的修改在于User分组,其它的几个分组完全不需要动;粉色框里面有注释user begin xx user end xx,在两者之间添加的用户代码在重新使用STM32CubeMX生成工程后会保留,所以用户代码一定要加在这样的注释之间。
1.底板红色LED1灯
step1:先来个热身的,Gokit底板红色LED灯丝印为LED1,我们在mxconstants.h文件里面添加三个宏定义:
#define LED1_ON() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)
#define LED1_OFF() HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)
#define LED1_Toggle() HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin)
顾名思义就是控制LED灯的开、关、翻转;
step2:回到main文件,在while循环里面添加代码:
LED1_Toggle();
HAL_Delay(500);
其中HAL_Delay()是HAL库的延时API,时基是1ms,因此上面代码的含义就是每隔500ms翻转LED1的状态,编译工程,烧录到Gokit STM32
可以看到LED1是否按上述分析执行;
2.定时器
估测测定时器2和3是不是1ms中断;
定时器在使用前需要手动开启,在main函数里面添加代码:
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
以启动定时器;
在main文件编写测试代码,即定时中断服务函数:
uint32_t nn=0,tt=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance ==TIM3)//tim3 1ms中断,作为MCU和WIFI模组的心跳用
{
nn++;
if(nn==500)
{
nn=0;
// LED1_Toggle();
}
}
if(htim->Instance ==TIM2)//tim2 1ms中断,按键检测逻辑
{
tt++;
if(tt==200)
{
tt=0;
LED1_Toggle();
}
}
}
HAL库的定时器中断服务函数是以回调机制实现的,我们在这里使用Gokit底板LED1的翻转大体判断是否正确;
视频:
http://player.youku.com/player.php/sid/XMTc4NDY4MTQ5Mg==/v.swf
3.串口
(1)串口1
串口1用于打印调试日志,我们需要映射到printf函数以方便使用;
我们在main文件中添加代码:
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1);
return ch;
}
然后在魔术棒那里勾选使用MicroLib:
这样就把串口1重映射到了printf函数;
屏蔽原先编写的测试代码,在主函数while循环添加如图测试代码,编译工程,烧录好后,使用Micro USB线连接Gokit和电脑,打开串口调试助手,设置波特率115200,,可看到目标字符说明一切OK;
(2)串口2
串口2用于和WIFI模组通信,配置的是中断接收;
屏蔽原先测试代码,我们在main函数外面编写测试代码:
uint8_t RxData=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(UartHandle->Instance ==USART2 )
{
LED1_Toggle() ;
HAL_UART_Transmit(&huart2,(uint8_t *)&RxData,1,1);
HAL_UART_Receive_IT(&huart2, &RxData,1);
}
}
HAL_UART_Receive_IT(&huart2, &RxData,1)需要在初始化完成后进入while循环前调用一次,以开启中断接收,这段代码实现了接收到一字节数据后进入中断服务函数,在中断服务函数里面将LED1翻转,并发送出去;
编译工程,烧录好后,使用USB转串口模块连接Gokit和电脑,按如下接线:
打开串口调试助手,设置波特率9600,发送一个字符,LED1状态翻转并回显该字符说明一切OK;
视频:http://player.youku.com/player.php/sid/XMTc4NDY4MjQxMg==/v.swf
至此核心组件已调试完毕,接下来添加必要文件到工程;
四、机智云相关文件的添加和代码移植
STM32CubeMx生成的只是STM32工程框架,目前还和机智云一点关系都没有,接下来的目的是如何简单的添加文件,移植驱动连上机智云;
这里涉及到的是:一是RGB LED驱动的移植;二是按键驱动的移植;三是机智云串口、产品相关文件的添加;
1.在开发者中心新建全彩智能应用,步骤参考教程:http://club.gizwits.com/thread-3572-1-1.html
2.生成MCU方案STM32工程后,下载解压,里面有几个重要的文件:
这是Gokit 2个按键的驱动,但是是基于STM32标准库函数的,与STM32CubeMX生成的工程使用的HAL库不一样,我们需要修改几个API;
这是和机智云产品定义、用户-云端接口相关的文件;
还有一个是基于STM32标准库的RGB LED驱动文件,这个文件云端生成的工程里面没有,在哪呢?答案是官网下载中心,机智云微信宠物屋STM32版本例程,与STM32CubeMX生成的工程使用的HAL库不一样,我们需要修改几个API;
关于如何把这些文件添加到STM32CubeMX生成的工程?需要修改哪些地方才能把它移植到适用于HAL库?这里不再重复了,参考教程即可:
http://club.gizwits.com/thread-3641-1-1.html
最后附上工程源代码和几个文件:
1.STM32CubeMX生成的PDF配置报表:
2.完整的工程源码:
|
|