NUCLEO-F091RC 试验

前言

在stm32系列单片机中, 最多能提供8个串口。
用STM32CubeMX看看, 8个串口的MCU都有哪些?
在这里插入图片描述
可以看到,只有STM32F091和STM32F098能提供8个串口.
有开发板支持的MCU只有STM32F091,那就选有官方工程加持的STM32F091.
STM32F091有2种开发板, 只是做个串口扩展的初步试验,没必要整猴贵的评估版,就弄块NUCLEO板,管脚够用就行。

前几天,从x宝上订的NUCLEO-F091RC到了。正好在家封闭开发,静静的继续试验。
准备看看STM32F091的细节问题,希望有个初步体会,不影响画原理图就好,程序等板子做回来,可以按步就班的写.

Trace HW not present

用STM32的MCU, 喜欢用ITM调试。

随便打开一个串口工程 en.stm32cubef0\STM32Cube_FW_F0_V1.11.0\Projects\STM32F091RC-Nucleo\Examples\UART\E2_UART_TwoBoards_ComIT\MDK-ARM\Project.uvprojx

设置好MDK中的ITM选项。
在这里插入图片描述
单步运行弹出报错 Trace HW not present(跟踪硬件不存在)
“Trace HW not present” 的意思是 “Trace硬件不存在”
在这里插入图片描述
官方工程针对具体开发板写的,都是没错的。
我只加了ITM设置,那就是ITM设置引起的问题。
看报错提示,像是TRACE功能不支持的样子。
在动过设置的官方工程上,去掉ITM设置,再单步正常了。

验证F091是否提供SWO管脚

打开STM32CubeMX,新建一个STM32F091的工程。
先看看调试引脚
在这里插入图片描述
看到配置中,只有调试引脚,并不提供SWO引脚。
在这里插入图片描述
STM MCU的调试引脚都是PA13(SWDIO), PA14(SWCLK)
再看看支持SWO的MCU是引脚是咋定义的。
在这里插入图片描述
有TRACE功能的MCU, 会提供带Trace功能的调试引脚定义。
在这里插入图片描述
可以看到,支持Trace功能的MCU, 会在PB3引脚上提供SWO功能。
看看F091的PB3引脚是否可以提供SWO功能。

在这里插入图片描述
可以看到F091的PB3没有SWO功能。
为啥官方不提供F091的SWO引脚呢,真费解.

NUCLEO-F091RC没接主晶振

看到NUCLEO-F091RC开发板上没有主晶振,难道和板载的ST-LINK用的一个主晶振?
结合板子上焊接的实际原件,PCB, 原理图,看看主晶振是哪来的?
在这里插入图片描述
板子上R35, R37都没焊, pin6是OSC_OUT上了扩展插座, 这个扩展插座上没接东西。
pin5_PF0是OSC_IN, 网络上接了2个元件SB55和SB50
SB55(通向扩展插座)没焊接
在这里插入图片描述
SB50焊接了0R电阻,那来源就是MCO这个网络。
在这里插入图片描述
跟着PCB走线从SB50跟到了STLINK板子的SB16
看到开发板上, SB16是焊接的。
在这里插入图片描述
那就等于主晶振来源于内建的ST-LINK板子的PA8
ST-LINK板子板子用的F103CB, PA8脚为可以作为RCC_MCO
在这里插入图片描述
到此,可以知道主晶振来自于内建的STLINK板子的晶振晶振输出。

看看F091程序中,是使用的外部晶振还是内部晶振。

开始就以为是用的STLINK板子的主晶振,看程序发现不是这样的。

int main(void)
{
  /* STM32F0xx HAL library initialization:
       - Configure the Flash prefetch
       - Systick timer is configured by default as source of time base, but user 
         can eventually implement his proper time base source (a general purpose 
         timer for example or other time source), keeping in mind that Time base 
         duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and 
         handled in milliseconds basis.
       - Low Level Initialization
     */
  HAL_Init();
  
  /* Configure the system clock to 48 MHz */
  SystemClock_Config(); // 时钟配置

void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;
  
  /* Select HSI48 Oscillator as PLL source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; // 用的HSI,并没有用外部晶振
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI48;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  {
    /* Initialization Error */
    while(1); 
  }

  /* Select PLL as system clock source and configure the HCLK and PCLK1 clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1)!= HAL_OK)
  {
    /* Initialization Error */
    while(1); 
  }
}

看看时钟配置图,可以确认时钟初始化这么写,确实用的HSI.
在这里插入图片描述
在这里插入图片描述
用CubeMX配出48MHZ主时钟时,用HSI配不出来,最后CubeMX自己的方案是用HSI48.
看着这时钟配置图,再和官方程序中时钟初始化代码比对,可以知道,程序中用的是HSI48,没用HSE.
晶振也没俩钱,实际板子是不内建ST-LINK的。所以实际用的时候,还是用HSE.
官方demo这么写,是为了说明使用HSI48精度也很高么?

demo的多少问题

看到csdn上传的一个demo说明中,说F091官方demo不多。
不知道是不是他用的时候不多啊。
ST官方板子的demo还是挺多的,要啥有啥。
在这里插入图片描述

总结

追究了上面2个问题后,随便打开几个demo工程单步了一下。
因为demo工程都是HAL库的,仅从代码上,根本不知道自己是在用哪种ST的MCU, 也不知道是在用哪种HAL库(M0,M3, M4, M7)。这就是HAL库的好处。

用了用NUCLEO-F091RC, 跑了跑工程, 看了看原理图, 感觉硬件连接上,和其他STMCU没啥大区别。
就是没有SWO用,有点遗憾。

剩下主要就是MCU固件的编写,可以参照ST官方的demo, 需要哪个知识点,现学就赶趟。

F091RC的初体验就到这吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值