打印
[Kinetis]

使用超核库调试KL25 UART发现的疑问与解决过程

[复制链接]
1116|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyriz|  楼主 | 2015-1-29 11:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
从超核库中加入串口模块时编译报错:


提示这是一个只读变量,不能写入。我跟踪到MKL25Z4.h里面发现,UART_Type结构体里面S1被定义为__I,

而__I的宏定义如下,就是用来定义一个只读的类型:
#define __I volatile const /*!< defines 'read only' permissions */

似乎这是两个地方起冲突了。原因在哪呢?
MKL25Z4.h这个文件是KEIL里自带的,不大可能会出错。但是

在参考手册上面显示,这个低5位其实是可以读写的,w1c的意思是写1清0。两个地方都没问题?
仔细看MKL25Z4.h里UART相关的部分,发现了另一个类似的结构体UART0_Type

看来问题出在这里,UART0是要跟其他的串口模块有区分开来。
下图是除UART0以外的其他串口模块S1这个寄存器的情况,全是只读的。

所以,编程的时候UART0与其他的模块要区分一下。OK,问题解决。

相关帖子

沙发
FSL_TICS_ZJJ| | 2015-1-29 14:33 | 只看该作者
其实,UART0的结构体在头文件中有自己的定义:
typedef struct {
  __IO uint8_t BDH;                                /**< UART Baud Rate Register High, offset: 0x0 */
  __IO uint8_t BDL;                                /**< UART Baud Rate Register Low, offset: 0x1 */
  __IO uint8_t C1;                                 /**< UART Control Register 1, offset: 0x2 */
  __IO uint8_t C2;                                 /**< UART Control Register 2, offset: 0x3 */
  __IO uint8_t S1;                                 /**< UART Status Register 1, offset: 0x4 */
  __IO uint8_t S2;                                 /**< UART Status Register 2, offset: 0x5 */
  __IO uint8_t C3;                                 /**< UART Control Register 3, offset: 0x6 */
  __IO uint8_t D;                                  /**< UART Data Register, offset: 0x7 */
  __IO uint8_t MA1;                                /**< UART Match Address Registers 1, offset: 0x8 */
  __IO uint8_t MA2;                                /**< UART Match Address Registers 2, offset: 0x9 */
  __IO uint8_t C4;                                 /**< UART Control Register 4, offset: 0xA */
  __IO uint8_t C5;                                 /**< UART Control Register 5, offset: 0xB */
} UART0_Type;
楼主也可以参考下官方KL25的例程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

439

帖子

7

粉丝