记录自己参加重庆市第十届合泰杯的学习过程。
在此不得不吐槽一下,HT1656居然只有两个串口。
通用同步一步收发器—USART
▄ 同时支持异步和时钟同步串行通信模式
▄ 异步工作频率高达 4.5MHz, 同步工作频率高达 9MHz
▄ 全双工通信
▄ 完全可编程串行接口通信特性包括:
字长: 7, 8 或 9 位字符
校验位: 奇、 偶或无奇偶校验位的产生和检测
停止位: 1 或 2 个停止位产生
位顺序: 低位优先或高位优先传输
▄ 错误侦测: 奇偶校验、 溢出和帧错误
▄ 自动硬件流控制模式 – RTS、 CTS
▄ IrDA SIR 编码器和解码器
▄ 具有输出使能控制的 RS485 模式
▄ FIFO 深度: 接收端及发送端皆有 16×9 位缓存器
通用同步异步收发器 USART 提供了一个灵活的采用同步或异步传输的全双工数据交换。USART 用来转换并行和串行接口之间的数据, 通常也被用作 RS232 标准通信。 USART 外设功能支持四种类型的中断, 包括线路状态中断、 发送 FIFO 空中断、 接收器阈值级别到达中断和超时中断。 USART 模块包括一个 16 字节的发送 FIFO、 (TX_FIFO) 和一个 16 字节的接收FIFO(RX_FIFO)。 通过读取线路状态寄存器 LSR, 软件可以检测 USART 的错误状态。 状态包括传输模式下的类型和状况以及因奇偶、 溢出、 帧和暂停事件造成的错误状况。
串口初始化函数
// 串口0初始化函数
// PA2 TX
// PA3 RX
// bound 波特率
void usart0_init(u32 bound)
{
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
USART_InitTypeDef USART_InitStructure;
CKCUClock.Bit.PA = 1;
CKCUClock.Bit.USART0 = 1;
CKCUClock.Bit.AFIO = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
/* Config AFIO mode as USART0_Rx and USART0_Tx function. */
AFIO_GPAConfig(AFIO_PIN_2 | AFIO_PIN_3, AFIO_MODE_6);
/* Config AFIO mode as USARTx function */
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
USART_InitStructure.USART_StopBits = USART_STOPBITS_1;
USART_InitStructure.USART_Parity = USART_PARITY_NO;
USART_InitStructure.USART_Mode = USART_MODE_NORMAL;
USART_Interrupt_Init(HT_USART0, &USART_InitStructure, USART_RX_INT);
USART_TxCmd(HT_USART0, ENABLE);
USART_RxCmd(HT_USART0, ENABLE);
NVIC_EnableIRQ(USART0_IRQn);//配置中断线
}
串口中断服务函数
//串口中断服务函数
void USART0_IRQHandler(void)
{
u8 Res;
if(((HT_USART0->IIR) & USART_IID_RDA ) == USART_IID_RDA ) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res = USART_ReceiveData(HT_USART0); //读取接收到的数据
if((USART0_RX_STA&0x8000)==0)//接收未完成
{
if(USART0_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x76)USART0_RX_STA=0;//接收错误,重新开始
else USART0_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0xb7)USART0_RX_STA|=0x4000;
else
{
USART0_RX_BUF[USART0_RX_STA&0X3FFF]=Res ;
USART0_RX_STA++;
if(USART0_RX_STA>(USART0_REC_LEN-1))USART0_RX_STA=0; //接收数据错误,重新开始接收
}
}
}
}
}
数据发送函数
//发送数据
//参数: addr:地址 cmd:命令 data:待发送数据
//返回值 无
void sendData(u8 *data)
{
u8 i;
for(i = 0; i < 20; i++)
{
USART_SendData(HT_USART0,data[i]); //发送数据
}
}
//重定义串口0的printf发送函数
//当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
//使用 u0_printf("yl");
//u0_printf("%d\r\n",num);
void u0_printf(char* fmt,...)
{
u16 i,j;
va_list ap; //va_list用于解决变量参数不知道
va_start(ap,fmt);
vsprintf((char*)USART0_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART0_TX_BUF); //此次发送数据的长度
for(j=0; j<i; j++) //循环发送数据
{
// while(USART_GetFlagStatus(HT_USART0,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(HT_USART0,USART0_TX_BUF[j]); //向串口发送数据
}
}
以下分享找到的相关的HT1656的相关资料
链接: http://pan.baidu.com/s/1dEJQe9j
密码:suyt
CQUT_YL