串口 驱动模块
C51 串口 硬件
TI = 1 表示发送完毕
RI = 1 表示接收完毕
C51 串口中断
移植到 nu-lb-nuc140
//Define MCU Interfaces
#define MCU_INTERFACE_UART1
#define UART_CLOCK_SOURCE_HIRC // HXT, LXT, PLL, HIRC
#define UART_CLOCK_DIVIDER 3
#define PIN_UART1_RX_PB4
#define PIN_UART1_TX_PB5
UART_Open(UART1,115200); // enable UART1 at 115200 baudrate
UART_ENABLE_INT(UART1, UART_IER_RDA_IE_Msk);
NVIC_EnableIRQ(UART1_IRQn);
UART_Write(UART1,"Hello Uart1\r\n",13);
void UART1_IRQHandler(void)
{
//if(UART_IS_RX_READY(UART1)) {
//if(UART_IS_TX_EMPTY(UART1)){
//cChar = UART_READ(UART1);
//UART_WRITE(UART1, cChar);
//UART_DISABLE_INT(UART1,UART_IER_THRE_IEN_Msk);
//uint32_t UART_Write(UART_T* uart, uint8_t *pu8TxBuf, uint32_t u32WriteBytes);
}
参考代码2 :
void UART1_IRQHandler(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
char cChar;
uint8_t in_char;
if(UART_IS_RX_READY(UART1)) {
cChar = UART_READ(UART1);
//printf("%c",cChar);
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
}
if(UART_IS_TX_EMPTY(UART1)){
/* The interrupt was caused by the THR becoming empty. Are there any
more characters to transmit? */
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
{
/* A character was retrieved from the queue so can be sent to the
THR now. */
UART_WRITE(UART1, cChar);
}
else
{
UART_DISABLE_INT(UART1,UART_IER_THRE_IEN_Msk);
}
}
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}
Nuc140 的 串口 发送完成标志
遇到问题 malloc 失败:
In Hard Fault Handler
r0 = 0x20002eab
r1 = 0x20002eab
r2 = 0x3f400000
r3 = 0xc0d
r12 = 0x0
lr = 0x160d
pc = 0xe9a
psr = 0x61000000
你的arm处理器在启动的时候有个文件是专门配置stack和heap的,吧heap的大小配置成0,这样malloc就无法使用了,也不会浪费内存空间了。
失败的原因是啥呢 ?有空分析一下。
struct QueueBuffer
{
unsigned char *aBufferStart;
unsigned char *aBufferEnd;
unsigned char *pIn;
unsigned char *pOut;
unsigned char mCount;
};
这个样子会失败,
修改为:
__packed struct QueueBuffer
{
unsigned char *aBufferStart;
unsigned char *aBufferEnd;
unsigned char *pIn;
unsigned char *pOut;
unsigned char mCount;
};
会成功,具体原因有空分析一下.
测试代码如下:
https://download.csdn.net/download/wowocpp/10775124
Keil 中对齐
4 ARM平台中的对齐
在ARM平台的编译器中,没有提供象“#pragma pack”这么丰富的带参数对齐指令,只有一个关键字“__packed”。
__packed 限定符将所有有效类型的对齐边界设置为 1,如果一个结构没有这个限定符,默认向表数能力最强的那个数据类型对齐。
typedef __packed struct
{
double dValue1;
char u8Value2;
int u32Value3;
} ASampleStructor;
上例中,size值为13,说明1字节对齐后,该结构总长为13字节。去掉__packed对齐后,为16字节。
串口驱动的 可以运行的代码:
https://download.csdn.net/download/wowocpp/10775242
(稍后补充)