在外面的设计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};
问题刚刚解决了。如果在CLK_PER_REG寄存器中启用了UART时钟;)如果启用了UART时钟;)
嗨w.puchar,
很高兴你想出来了,谢谢你的表明
谢谢,PM_DIALOG.