在有限的空间内开发自己的辅助引导加载程序

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
3个帖子/ 0个新帖子
最后发表
w.puchar
离线
最后看到:3年2个月前
加入:2018-05-08塔利班)
在有限的空间内开发自己的辅助引导加载程序

在我们的设计中,DA14583与PIC16LF1824 MCU相连,PIC16LF1824 MCU可以做很多事情,包括单线接口等,单线接口本身可以直接通过其他设备或通过USB访问。我就不细说了,因为这些都无关紧要。

真正重要的是,我需要(固件更新)从PIC16的DA系统ram加载二级引导加载程序,所以它实际上被限制到1kB。

这排除了使用SDK例程和工具,但是使用开源工具(gcc)和没有库,我能够在72字节做LED闪烁。所以二级引导加载程序可以达到1kB。

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

到目前为止,我尝试使用没有中断的UART。没有成功,UART_LSR_REG中的UART_THRE位总是0
只要不断地把'x'放在UART传输寄存器中-什么也不发送。

UART似乎在某种程度上受阻了。

我的最小代码(闪烁led和发送'x'在uart)如下:
定义mem2(x) (*((volatile unsigned short *)x))
#定义clear_watch mem2 (0 x50003100) = 0 x007f;
#定义P0_SET_DATA_REG mem2 (0 x50003002)
#定义P0_RESET_DATA_REG mem2 (0 x50003004)
#定义UART_RXTX_REG mem2 (0 x50001000)
#定义UART_IER_DLH_REG mem2 (0 x50001004)
#定义UART_LCR_REG mem2 (0 x5000100c)
#define UART_LSR_REG mem2(0x50001014) //patrz strona 42
#define UART_MSR_REG mem2(0x50001018) //patrz strona 43
不稳定的int led_count;
/ / dokumentacja w da14583_ds_3v0.pdf
//Chcemy 57600 baud, mamy zegar 16000000Hz, 57600=16*10^6/(16*除数)
/ /除数= 10000000/57600 = 17
#定义UART_divisor 17
void main () {
//端口P0_0设置为UART1 TX
mem2 (0 x50003006) = 0 x0302;
//端口P0_1设置为UART1 RX
mem2 (0 x50003008) = 0 x0001;
// P0_2端口设置为输出,LED连接此处
mem2 (0 x5000300a) = 0 x0300;
//启用fifo,注册FCR如果uart_lcr_reg。DLAB = 0
// xmit fifo reset, RCVR fifo reset, fifo enabled
// SetBits16(UART_LCR_REG, UART_DLAB, 0);
UART_LCR_REG& = ~ 0 x80;
/ / SetWord16 (UART_IIR_FCR_REG 7);
mem2 (0 x50001008) = 7;
//禁用中断,如果uart_lcr_reg . register。DLAB = 0
/ / SetWord16 (UART_IER_DLH_REG 0);
UART_IER_DLH_REG = 0;
//为波特率为115200的读写锁存寄存器,为uart_lcr_reg注册uart_dlh / dll_regDLAB = 1
// SetBits16(UART_LCR_REG, UART_DLAB, 1);
UART_LCR_REG | = 0 x80;
/ / SetWord16 (UART_IER_DLH_REG 0);//用于串行时钟16MHz波特率115200
/ / SetWord16 (UART_RBR_THR_DLL_REG 9);//设置波特率~115200 = serial_clk/(16*9)
UART_IER_DLH_REG = 0;
UART_RXTX_REG = 17;
//没有奇偶校验,1停止位,8数据长度和
/ / SetWord16 (UART_LCR_REG 3);
UART_LCR_REG = 3;
/ / SetBits16 (UART_LCR_REG UART_DLAB 0);
UART_LCR_REG& = ~ 0 x80;
/ /不中断
UART_IER_DLH_REG = 0;
而(1){
/ / (! (UART_LSR_REG&0x20));
UART_RXTX_REG =“x”;
如果((led_count + +) &0x40000)
P0_SET_DATA_REG = 4;
其他的
P0_RESET_DATA_REG = 4;
clear_watch;}

typedef无效(* irqhandler) ();

Irqhandler const vector [] __attribute__ ((section (".vectors")))={
(irqhandler) 0 x20009800主要};

设备:
w.puchar
离线
最后看到:3年2个月前
加入:2018-05-08塔利班)
问题就解决了。UART

问题就解决了。如果在CLK_PER_REG寄存器中启用UART时钟,UART工作得更好;)

PM_Dialog
离线
最后看到:1周4天前
工作人员
加入:2018-02-08 11:03
嗨w.puchar,

嗨w.puchar,

很高兴你弄明白了,谢谢你的暗示

谢谢,PM_Dialog