编辑: hyszqmzc 2016-12-28

9600 bauds, 8-bit data, no parity Serial pc(SERIAL_TX, SERIAL_RX);

DigitalOut myled(LED1);

int main() { int i = 1;

pc.printf( Hello World !\n );

while(1) { wait(1);

pc.printf( This program runs since %d seconds.\n , i++);

myled = !myled;

} } 此程序的目的是串口配置为:波特率 9600,数据位

1 位,无奇偶校验位.向PC 打印 Hello World! 后每一秒再循 环打印一次 This program runs since &

d seconds. 对其进行编译下载,然后打开电脑的上串口调试软件,直接使用 NUCLEO-F030R8 自带的虚拟串口功能(在板上, ST-LINK 的串口已经连接到 STM32F030R8 的PA2&

PA3 上,可以直接使用).按波特率

9600 配置后打开接收 STM32F030 发送过来的字符,结果发现收到的全是乱码. 使用示波器对串口通讯进行观察,发现波特率并非 9600,而是 57600,将串口调试软件的波特率修改成

57600 后就 能正常接收到字符了,可是, This program runs since &

d seconds. 也不是

1 秒打印

1 次!

3 3

3 3. . . .问题调研 问题调研 问题调研 问题调研 在串口实验中,我们发现实际的波特率

57600 是目标波特率

9600 的6倍.这让我们可以联想到 48MHz 主频和 8MHz 主 频的关系,也就是说,很有可能此 STM32F0 的mbed 库本身应该是基于 8MHz 下进行的,而实际上 STM32F030 工作在 48MHz 的主频上,且时钟相关参数是按 8MHz 来设计的.对于这种怀疑我们进行探讨. 由于已经怀疑 STM32F0 在mbed 库中的程序可能存在问题,所以就必须把库函数源文件挖出来看,而不是使用库函数编 译文件了.以串口例程为例,进行调研. 1) 程序工作区选中 Nucleo_printf 项目,点击上面的 Import 按钮. 在 Search 按钮左边输入 mbed ,点击 Search 按钮,可以看到以下列表: 其中 mbed-src 就是我们想要的 mbed 库源程序了,双击它将它加入到 Nucleo_printf 项目中.并在项目原 mbed 编译 文件上点右键,选择 delete 将其删掉.(如果不删掉,由于库的重复,将会导致编译无法通过).新的项目结构 如下图: api 文件夹包含着 mbed API 的头文件,common 文件夹包含 mbed API 的源文件,hal 文件夹包含硬件抽象层文件, targets 文件夹才是包含 cmsis 和各个厂商各个目标板的相应底层库.我们使用的是 NUCLEO-F030R8,所以需要查 找的是 TARGET_STM32F0 的内容以及 TARGET_NUCLEO_F030R8 的内容. 2) 由于 mbed 开发平台无法单步运行等操作,为了探究问题的所在,我们将其输出到其他 IDE 上进行调试,比如 Keil IDE.在Nucleo_printf 项目上点右键,选择 Export Program . 弹出对话框,此处选择 Keil uVision

4 ,点击 Export 按钮,开始输出项目文件. 将输出的 Nucleo_printf_uvision_nucleo_f030r8.zip 文件下载下来,进行解压缩,得到 Nucleo_printf 的文件夹. 双击 Nucleo_printf.uvproj 打开项目.项目文件其实很清爽,只有一个 Src 文件夹,包含了所有的程序文件. 3) 由于怀疑的是时钟有问题,所以自然而然,先打开时钟配置文件 system_stm32f0xx.c 先查看一番.在此代码中, 首先看到一个很清楚的错误的问题: /* Select the clock sources (other than HSI) to start with (0=OFF, 1=ON) */ #define USE_PLL_HSE_EXTC (1) /* Use external clock */ #define USE_PLL_HSE_XTAL (1) /* Use external xtal */ 在NUCLEO-F030R8 的板子上 HSE 是没有晶振的,也不是使用外部时钟,所以在这个位置不应该将 USE_PLL_HSE_EXTC 和USE_PLL_HSE_XTAL 设置为 0,需要将它们都改成 0. 再研究一下几个函数的代码: ? void SystemInit(void) 此函数进行系统的初始化,并未进行配置. ? void SystemCoreClockUpdate (void) 根据时钟寄存器的值更新系统时钟参数. ? void SetSysClock(void) 配置系统时钟,USE_PLL_HSE_EXTC 和USE_PLL_HSE_XTAL 就是在这里被使用的.如果没有配置 USE_PLL_HSE_EXTC 和USE_PLL_HSE_XTAL,这个程序将系统时钟源配置成使用 HSI+PLL 得到 48MHz 的 主频,这对于遇到的问题非常重要. 4) 再来看时钟配置的函数 SetSysClock 和SystemCoreClockUpdate 是在什么地方被调用的,打开 mbed_overrides.c 文件,可以看到以下代码: // This function is called after RAM initialization and before main. void mbed_sdk_init() { /* Configure the Cube driver */ SystemCoreClock = 8000000;

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题