本帖最后由 pkuzhx 于 2016-5-8 22:01 编辑
前一阵比较忙,一直没有发文。现在终于有空来搞一下了。 我是st新手,之前只用过F401,并且是用cubemx+IAR来做的,基本只用过GPIO、TIMER、I2C、USB等。所以,以我的水平,评测就谈不上了,只能是学习一下。我的学习计划分为两部分: 1 继续使用cubemx+IAR来开发F446,既检验自己之前所学,又可以给同样的新手一个详细的教程,看看不懂寄存器的菜鸟是如何一点点上手的。 2 使用mbed开发。很早就听说过mbed了,但一直没有用过,说实话也不太清楚它到底是个什么东西。趁这个机会正好从0开始学习一下,同样把学习过程也展示出来。 当然,最终还是要搞个东西出来的。我最后计划实现一款简单的心率波形显示软件:F446连接光学传感器,采集手指(或其他部位)的心率波形,然后上传数据到PC,在PC上做一个软件显示出来。 以后正确每周发一篇,至少5篇,在6月结束前把这个东西搞定(请原谅重度拖延症患者……)
第1节 cubemx之点亮LED
(1)cubemx新建工程 选择 newProject 选择对应型号 先保存一次,使用过程中也随时保存。注意cubemx与有道词典不兼容,别开有道就好。
(2)参考文档 任务:循环点亮熄灭LD1、LD2、LD3三个LED。在UM1974 User manual中找到有关LED的描述: 可知LD1对应PB0,LD2对应PB7,LD3对应PB14,并且IO口高时LED亮。 我认为新手学习一款MCU时,只要大概知道该MCU有什么功能特性即可,需要学习哪一块就看哪一块的文档,其他功能该开始都不需要了解。
(3)cubemx设置IO口 建立工程后,cubemx默认在pinout界面。一开始MCU的管脚很密(毕竟有144个脚),看不清楚,把光标放在MCU图标上,就可以用滚轮放大了。
找到PB0,单击鼠标,设置为GPIO_Output。同理设置PB7和PB14。 设置过的管脚是绿色的,而且有个小钉子。 设置完以后,发现左侧有些外设图标上有黄色的叹号或红色的×,这是因为这些外设需要用到PB0或PB7或PB14。
(4)cubemx设置时钟 我们可以看到板子上的高频外部时钟(HSE X3)是没有焊接的,我们可以选用内部高频HIS RC时钟。但是为了学习时钟配置,这里决定使用ST-Link提供的外部时钟,关于还有什么其他可用的HSE,可以参照文档中的6.7.1 OSC clock supply。 ST-Link提供8M时钟。
继续在pinout界面,选择左侧外设的RCC,在HSE一项中选择crystal/ceramic resonator。 转到clock configuration界面。
首先在输入频率input frequency中填入8,因为ST-Link提供的8MHz的外部时钟;然后在PLL source MUX中选择HSE,要使用外部时钟;再在system clock Mux中选择HSE。注意这里选择HSE和HIS时,后面时钟树的变化。设置完成后,时钟树图中没有红色警告则说明设置成功,否则要重新设置。
(5)进一步配置 转到configuration界面。 单击GPIO,可以看到PB0、PB7、PB14的配置,我们不需要做更高级的配置,所以默认即可。
(6)生成工程 点击齿轮
图标。 Project界面设置如下: IDE项我选的是EWARM,即IAR for ARM,也可选择keil等其他工具,但生成的代码会有区别。 Code generator选择如下: 单击OK即可。 (一开始可能会弹出对话框说固件没有下载,按提示下载即可。如果下载速度过慢,可选择离线安装的方法,参考http://www.stmcu.org/module/forum/thread-601397-1-1.html,下载F4最新版1.11.0) 生成完毕后打开工程。
(7)IAR中的操作 IAR要安装7.4以上版本,否则可能会没有F446。
GPIO初始化的代码在gpio.c中: void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_14|GPIO_PIN_7, GPIO_PIN_RESET);
/*Configure GPIO pins : PB0 PB14 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_14|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
操作GPIO的函数原型在stm32f4xx_hal_gpio.c中,我们要用到的就是 void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
这一个函数。
对于函数的使用方法,直接看函数定义前面的注释即可。 * @param GPIOx: where x can be (A..K) to select the GPIO peripheral for STM32F429X device or
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.
* @param GPIO_Pin: specifies the port bit to be written.
* This parameter can be one of GPIO_PIN_x where x can be (0..15).
* @param GPIO_PIN_x: specifies the value to be written to the selected bit.
* This parameter can be one of the GPIO_PinState enum values:
* @arg GPIO_PIN_RESET: to clear the port pin
* @arg GPIO_PIN_SET: to set the port pin
对于三个参数都说的很清楚,GPIOx参数的值为GPIOx,其中x为A、B、C、D……;GPIO_Pin的值为GPIO_PIN_x,x为0-15;GPIO_PIN_x值为PIN_RESET或PIN_SET,分别为置高和置低。 然后在main.c中修改代码如下:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
}
/* USER CODE END 3 */
代码含义就是LD1~3依次点亮500ms然后熄灭。注意自己添加的代码一定要放到/* USER CODE BEGIN x */ 和/* USER CODE END x*/之间,否则在cubemx中更新过后,新生成的代码会把自定义代码覆盖掉。
(8)下载看效果 单击IAR的make图标
,显示0error,0 warning。 然后通过USB 连接F446 到PC (注意是ST-link 端的USB ),单击download and debug 图标
,然后再单击stop debugging(红X) 。
现在可以看到绿、蓝、红三个LED依次点亮、熄灭了!
|