OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9853|回复: 2

FREERTOS,关于STM32的串口初始化的问题,

[复制链接]

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2014-2-28 16:29:37 | 显示全部楼层 |阅读模式
 碰到这个问题,好奇葩的,望大神指点12
请教问题 关于STM32 UART

问题,如下,
在初始化UART的时候,发现USART的波特率寄存器,一致为0,写不进去,后来一步步的跟踪调试发现如下情况
调用USART_Init 这个函数在初始化的时候
在USART_Init 下有这么RCC_GetClocksFreq一个函数,是计算时钟频率的,
在RCC_GetClocksFreq 这个函数下,有一个,关于时钟的频率表
APBAHBPrescTable
它是静态表,初始化值如下





这个值是官方给的,
而我在跟踪调试的时候
发现

APBAHBPrescTable 值变成这样了,是啥情况,




这个工程代码里面,用到了FREERTOS,这个系统
请教???!!!

编译结果 


工程文件上传了,
,针对这个问题,我仿真用了原子的代码,发现初始化STM32 的USART1完全没问题,
望有知道解决办法的人指点下


这个是我今天碰到的第二个问题,第一个问题是上午碰到的,也是这个工程加了FREERTOS的,在加了文件系统之后,发现无法进行仿真,其现象如下:
跟踪启动文件的
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
这部分代码,发现 __main的地址,是0X08000130
而我在主工程里面发现 main函数的地址 是,0x08002dfe,
发现两个地址,对不上号,所以一直无法进行仿真,
后来,根据某位大神的建议,对于启动代码,修改如下
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  main

                ;LDR     R0, = SystemInit_ExtMemCtl ; initialize external memory controller
                ;BLX     R0

                ;LDR     R1, = __initial_sp        ; restore original stack pointer
                ;MSR     MSP, R1                   

                LDR     R0, =main
                BX      R0
                ENDP
这样修改之后,就能仿真了,
希望我碰到的这个问题,对以后的朋友有帮助,













FreeRTOS_stm32_6.3_Code.rar

7.15 MB, 下载次数: 339

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-2-28 21:41:21 | 显示全部楼层
最开始的时候,这个表的数据应该是没变的,你单步跟踪,看到哪个位置开始,才变化?然后就分析这个语句/函数。
__main,并不是main函数的入口,这个
详见(转帖):
   当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是:
    IMPORT main
    B main
    直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。
 
    在ARM ADS环境中,还另外提供了一套系统级的呼叫机制。
    IMPORT __main
    B __main
    __main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()。所以说,前者是库函数,后者就是我们自己编写的main()主函数;
    因此我们用的B __main其实是执行库函数,然后该库函数再调用我们的main() 函数,因此在单步调试时会看到先要跑一段程序(其实是库函数),然后再单步到我们自己的main函数(这个同时也说明如果有B __main 则就对应必须有main函数,否则编译出错),如果我们用 B main来进入我们的主函数的话,那在单步调试时就看到直接进入到我们自己的main函数了,中间不会看到其他程序;
    那么用B __main和用B main 这两这进入我们的main函数方式有什么不同呢?
    如果采用前者则会由编译器加入一段"段拷贝"程序,即我们说的从加载域到执行域转化程序;而采用后者就没有这个了,因此如果要进行 "段拷贝"只能自己动手编写程序来实现了,完成段拷贝后就可以进入我们的主函数了,当然这个主函数不一定是叫做main(),可以起个其他好听的名字,这个有别于使用B __main方式;不管采用哪种方式进入我们的程序,都要有一段"段拷贝"程序,跑完了段拷贝后才能可以进入我们主程序了!(顺便提一下:startup.s这个文件并没有所谓的"段拷贝"功能,再看也无益!)
 
    对含有启动程序来说,"执行地址与加载地址相同"不容易实现:
    如果执行地址与加载地址相同哪当然不需要做"段拷贝",但是个人理解编译器还会加入"段拷贝"程序(如果用B __main的话),只是因为条件不满足而不执行而已;但是对含有启动程序来说,"执行地址与加载地址相同"就不容易了.因为启动程序是要烧到非易失存储器里,用来在上电执行的,而这个程序必定会有RW段,如果RW放在非易失存储器,如FLASH,那就不好实现RW功能了,因此要给RW移动到能够实现RW功能的存储器,如SRAM等.因此,对含有启动程序来说,"执行地址与加载地址相同"就不容易实现;程序的入口点在C 库中的__main 处,在该点,库代码执行以下操作:
1. 将非零(只读和读写)运行区域从其载入地址复制到运行地址。
2. 清零ZI 区域。
3. 跳转到__rt_entry。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
 楼主| 发表于 2014-2-28 22:51:33 | 显示全部楼层
RCC_GetClocksFreq
是在进入这个函数的时候发生改变的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表