完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件:LPC1752(zlg开发板) + CF卡 (多余的IO脚已经悬空)
软件:RTT0.4.0RC for LPC176x 堆地址已经改成 0x10004000 rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)0x10004000); 问题:跟踪发现每次都在rt_device_init_all中初始化串口1或者串口2或者串口3的Fdiv = ( pclk / 16 ) / UART0_BAUDRATE;处直接跳入fault_rvds的rt_hw_hard_fault PROC再跳入硬件异常函数。初始化函数没有问题已经脱离RTT在工程中用过,软件仿真的时候能正常通过rt_device_init_all,怀疑是和硬件那里冲突,一时找不到!下面是初始化函数和异常响应的。finsh在串口0,去掉所有串口驱动则不会进入硬件异常。 static rt_err_t rt_uart_init (rt_device_t dev) { rt_uint32_t Fdiv; rt_uint32_t pclkdiv, pclk; /* Init UART Hardware */ LPC_PINCON->PINSEL0 &= ~0x000000F0; LPC_PINCON->PINSEL0 |= 0x00000050; /* RxD0 is P0.3 and TxD0 is P0.2 */ /* By default, the PCLKSELx value is zero, thus, the PCLK for all the peripherals is 1/4 of the SystemFrequency. */ /* Bit 6~7 is for UART0 */ pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03; switch ( pclkdiv ) { case 0x00: default: pclk = SystemCoreClock/4; break; case 0x01: pclk = SystemCoreClock; break; case 0x02: pclk = SystemCoreClock/2; break; case 0x03: pclk = SystemCoreClock/8; break; } LPC_UART0->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ Fdiv = ( pclk / 16 ) / UART0_BAUDRATE; /*baud rate */ LPC_UART0->DLM = Fdiv / 256; <==================== 此行跳入硬件异常,屏蔽后下面一行也进入到异常 LPC_UART0->DLL = Fdiv % 256; LPC_UART0->LCR = 0x03; /* DLAB = 0 */ LPC_UART0->FCR = 0x07; /* Enable and reset TX and RX FIFO. */ /* Ensure a clean start, no data in either TX or RX FIFO. */ while (( LPC_UART0->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) ); while ( LPC_UART0->LSR & LSR_RDR ) { Fdiv = LPC_UART0->RBR; /* Dump data from RX FIFO */ } LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART interrupt */ return RT_EOK; } psr: 0x00000000 pc: 0x00000000 lr: 0x00000000 r12: 0x00000000 r03: 0x00000000 r02: 0x00000000 r01: 0x00000000 r00: 0x00000000 hard fault on thread: (NULL) thread pri status sp stack size max used left tick error |
|
相关推荐
3个回答
|
|
另外CF卡驱动底层已经实现,
ReadCompactFlashSector是在指定的地址读一个扇区512Byte,则对RTT的接口是不是按下面的封装? static rt_size_t rt_ide_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) { unsigned long count , offset , idx ; unsigned char *pData ; pData = ( unsigned char *)buffer ; count = size / 512 ; offset = (pos / 512) + part.offset ; for(idx = 0 ; idx < count ; idx++) { ReadCompactFlashSector(size , pData) ; } ReadCompactFlashSector(offset , pData) ; return count ; } |
|
|
|
0.4.x的驱动,read/write的读写单位都是按照一个块大小进行的。
至于串口的问题,不是太明白,按照道理来说,不会出现对一个寄存器赋值就触发fault的情况。除非这个寄存器的地址是错误的(1752在这块上与1768有区别吗)。 |
|
|
|
代码请加标签。
[code] [/code] 同样的主题发一处即可。 size单位为sector。 如果sector_size为512, 那么从8192字节处读取1024字节时,pos传过来的值是 8192/512=16,size传过来的值是1024/512=2。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
786 浏览 0 评论
4210 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2520 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2926 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31442 浏览 11 评论
72903 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:32 , Processed in 0.671525 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号