用有限的空间开发我自己的辅助引导程序

⚠️
你好。。谢谢你来参加论坛。令人兴奋的消息!我们现在正在移动到我们的新论坛平台,将提供更好的功能,并包含在主对话网站的过程。所有帖子和账号都已迁移。我们现在只接受新论坛上的流量-请在//www.xmece.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
3个职位/0个新职位
最后一篇文章
w、 普查尔
离线
最后一次见到:3年1个月前
已加入:2018-05-08 08:30
用有限的空间开发我自己的辅助引导程序

进-出设计DA14583与PIC16LF1824 MCU相连,该MCU可以执行许多操作,包括onewire接口等。onewire接口本身可以通过其他设备或USB直接访问。我不谈细节,因为它们无关紧要。

重要的是,我需要(固件更新)辅助引导加载程序从PIC16加载到DA SysRAM中,所以它实际上被限制为总共1kB。

这不包括使用SDK例程和工具,但是使用开源工具(gcc)和没有库的情况下,我可以在72字节内完成LED blinker。所以1kB的辅助引导程序是可以实现的。

但我的问题是UART。我尝试添加基本的uart,在57600 bps时只传输x字符。

到目前为止,我尝试使用UART没有中断。不成功,UART\U LSR\U REG中的位始终为0
只要不断地把'x'在UART传输寄存器太-什么也不发送。

好像UART被阻塞了。

我的最小代码(led闪烁并通过uart发送“x”)如下:
定义mem2(x)(*((volatile unsigned short*)x))
#定义clear\u watch mem2(0x50003100)=0x007F;
#define P0\u SET\u DATA\u REG mem2(0x50003002)
#定义P0\复位\数据\寄存器mem2(0x50003004)
#定义UART\u RXTX\u REG mem2(0x50001000)
#定义UART IER DLH REG mem2(0x50001004)
#定义UART\U LCR\U REG mem2(0x5000100C)
#define UART\u LSR\u REG mem2(0x50001014)//patrz strona 42 instrukcji
#define UART\u MSR\u REG mem2(0x50001018)//patrz strona 43 instrukcji
volatile int-led\u计数;
//dokumentacja w da14583\u ds\u 3v0.pdf文件
//Chcemy 57600波特,mamy zegar 16000000Hz,57600=16*10^6/(16*除数)
//除数=10000000/57600=17
#定义UART\U除数17
void main(){
//端口P0\U 0设置为UART1 TX
mem2(0x50003006)=0x0302;
//端口P0\U 1设置为UART1 RX
mem2(0x50003008)=0x0001;
//端口P0\ U 2设置为输出,LED在此连接
mem2(0x5000300A)=0x0300;
//如果UART\U LCR\U REG.DLAB=0,则启用FIFO,寄存器FCR
//XMIT FIFO RESET,RCVR FIFO RESET,启用FIFO
//SetBits16(UART\u LCR\u REG,UART\u DLAB,0);
UART\u LCR\u REG&=~ 0x80;
//设置字16(UART\ U IIR\ U FCR\ U REG,7);
mem2(0x50001008)=7;
//禁用中断,如果UART\U LCR\U REG.DLAB=0,则注册IER
//设置字16(UART\u IER\u DLH\u REG,0);
UART\u IER\u DLH\u REG=0;
//波特率115200的存取除数寄存器,如果UART\U LCR\U REG.DLAB=1,则寄存器UART\U DLH/DLL\U REG
//SetBits16(UART\u LCR\u REG,UART\u DLAB,1);
UART|U LCR|U REG |=0x80;
//设置字16(UART_IER_DLH_REG,0);//串行时钟16MHz波特率115200
//设置字16(UART_RBR_THR_DLL_REG,9);//设置波特率~115200=串行时钟/(16*9)
UART\u IER\u DLH\u REG=0;
UART\u RXTX\u REG=17;
//无奇偶校验,1个停止位,8个数据长度和
//设置字16(UART\U LCR\U REG,3);
UART\U LCR\U REG=3;
//SetBits16(UART\u LCR\u REG,UART\u DLAB,0);
UART\u LCR\u REG&=~ 0x80;
//没有中断
UART\u IER\u DLH\u REG=0;
而(1){
//而((UART\u LSR\u REG&0x20));
通用异步收发器;
如果((发光二极管计数++)&0x40000)
P0\设置\数据\注册=4;
其他的
P0\U复位\U数据\U REG=4;
清除监视;}
}

typedef void(*irqhandler)();

irqhandler const vectors[]\uuu属性\uuuuu((“.vectors”)部分)={
(irqhandler)0x20009800,main};

设备:
w、 普查尔
离线
最后一次见到:3年1个月前
已加入:2018-05-08 08:30
问题刚刚解决。通用异步收发器

问题刚刚解决。如果在CLK\ U PER\ U REG寄存器中启用UART时钟,则UART工作得更好。)

PM\U对话框
离线
最后一次见到:4天9小时前
工作人员
已加入:2018-02-08 11:03
嗨,w.puchar,

嗨,w.puchar,

很高兴你弄明白了,谢谢你的指点

谢谢,下午好