HT1656 串口配置

       记录自己参加重庆市第十届合泰杯的学习过程。

       在此不得不吐槽一下,HT1656居然只有两个串口。


      通用同步一步收发器—USART

   ▄ 同时支持异步和时钟同步串行通信模式
   ▄ 异步工作频率高达 4.5MHz, 同步工作频率高达 9MHz
   ▄ 全双工通信
   ▄ 完全可编程串行接口通信特性包括:
       字长:
7 8 9 位字符
       校验位: 奇、 偶或无奇偶校验位的产生和检测
       停止位:
1 2 个停止位产生
       位顺序: 低位优先或高位优先传输
   ▄ 错误侦测: 奇偶校验、 溢出和帧错误
   ▄ 自动硬件流控制模式 – RTSCTS
   ▄ 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

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值