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

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
3个帖子/ 0新
最后一篇
W.Puchar.
离线
最后一次露面:2年11个月前
加入:2018-05-08 08:30
使用有限的空间开发我自己的辅助引导加载程序

在外面的设计DA14583连接到PIC16LF1824 MCU,这些MCU可以使用包括OneWire接口等。OneWire接口本身可以由另一个设备或过度USB直接访问。无所谓,我不会详细介绍。

重要的是,我需要(对于固件更新)辅助引导加载程序从PIC16加载到DA Sysram中,因此它实际上限制在1KB中。

这不包括SDK例程和工具,但使用开源工具(GCC),没有库,我能够在72个字节中进行LED闪烁。所以1KB用于辅助引导加载程序是可实现的。

但我的问题是UART。我试图添加仅在57600 bps的基本UART发送'x'字符。

到目前为止,我尝试使用UART没有中断。没有成功,UART_LSR_REG中的UART_THRE位始终为0
只需在UART中不断地将“X”放入UART发送寄存器中 - 没有发送任何东西。

似乎Uart被阻止了某种方式。

我的最小代码(眨眼LED并发送'X'OVER UART)如下:
定义mem2(x)(*((varatile unsigned short *)x)))
#define clear_watch mem2(0x50003100)= 0x007f;
#define p0_set_data_reg mem2(0x50003002)
#define p0_reset_data_reg mem2(0x50003004)
#define uart_rxtx_reg mem2(0x50001000)
#define uart_ier_dlh_reg mem2(0x50001004)
#define uart_lcr_reg mem2(0x5000100c)
#define uart_lsr_reg mem2(0x50001014)// patz strona 42 instrukcji
#define uart_msr_reg mem2(0x50001018)// patz strona 43 Instukcji
volatile int led_count;
// dokumentacja w da14583_ds_3v0.pdf
// Chcemy 57600波特,Mamy Zegar 16000000Hz,57600 = 16 * 10 ^ 6 /(16 *除数)
// divisor = 10000000/57600 = 17
#define uart_divisor 17.
void main(){
//端口P0_0设置为UART1 TX
MEM2(0x50003006)= 0x0302;
//端口P0_1设置为UART1 RX
MEM2(0x50003008)= 0x0001;
//端口P0_2设置为输出,LED在此连接
MEM2(0x5000300A)= 0x0300;
//启用FIFO,如果UART_LCR_REG.DLAB = 0,则启用FCR
// XMIT FIFO RESET,RCVR FIFO RESET,FIFO启用
// setBits16(UART_LCR_REG,UART_DLAB,0);
UART_LCR_REG&=〜0x80;
// setword16(UART_IIR_FCR_REG,7);
MEM2(0x50001008)= 7;
//禁用中断,如果UART_LCR_REG.DLAB = 0,则注册IER
// setword16(UART_IER_DLH_REG,0);
uart_ier_dlh_reg = 0;
//访问DaudIsorLatch寄存器的Baudrate 115200,如果UART_LCR_REG.DLAB = 1,则注册UART_DLH / DLL_REG注册UART_DLH / DLL_REG
// setBits16(UART_LCR_REG,UART_DLAB,1);
UART_LCR_REG | = 0x80;
// setword16(UART_IER_DLH_REG,0);//为串行CLK 16MHz Baudrate 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&=〜0x80;
//没有中断
uart_ier_dlh_reg = 0;
而(1){
//而(!(UART_LSR_REG&0x20));
uart_rxtx_reg ='x';
if((led_count ++)&0x40000)
p0_set_data_reg = 4;
别的
p0_reset_data_reg = 4;
clear_watch;}
}

typedef void(* irqhandler)();

irqhandler const向量[] __attribute__((部分(“.vectors”)))= {
(irqhandler)0x20009800,main};

设备:
W.Puchar.
离线
最后一次露面:2年11个月前
加入:2018-05-08 08:30
问题刚刚解决了。UART.

问题刚刚解决了。如果在CLK_PER_REG寄存器中启用了UART时钟;)如果启用了UART时钟;)

PM_DIALOG.
离线
最后一次露面:2天21小时前
职员
加入:2018-02-08 11:03
嗨w.puchar,

嗨w.puchar,

很高兴你想出来了,谢谢你的表明

谢谢,PM_DIALOG.