[开发板与模块]

【ESK32-30519 + ESK32-21001测评】4、人体温度计

[复制链接]
271|0
手机看帖
扫描二维码
随时随地手机跟帖
sky.sun.zz|  楼主 | 2022-9-17 14:01 | 显示全部楼层 |阅读模式
本帖最后由 sky.sun.zz 于 2022-9-17 14:22 编辑

【ESK32-30519 + ESK32-21001测评】4、人体温度计
   
    使用1只现成的额温测量模块,它采用USART串口传输方式与HT32F54253通讯,传送人体体温数据。
c251da3fc166e6a1e7e1f2ffb1e771b5

    官方ESK32-30519原理图中CN4关于HT32F54253的RXD和TXD标注貌似有误:
ERROR.png
   
    额温测量模块以每0.2秒一次的速率发送温度数据到串口,串口参数:
9600波特率
8位数据位
1位停止位
无奇偶校验
    设置HT32F54253以串口接收中断方式接收数据,同时需要移植HT官方LEDC演示代码。修改LEDC源显示代码为实时测量温度数据的显示。

    HT
32F54253的LEDC功能是一个亮点,使用者无需关心LED数码管的底层操作,只要把数据送显示缓冲区就够了。


部分代码
#include "ht32.h"
#include "ht32_board.h"
#include "ht32_board_config.h"
uint8_t DiapBuf[4]={0,0,0,0};

const u8 NumberChar[]={
  /* a: Seg4(0x10), b: Seg7(0x80), c: Seg2(0x04), d: Seg5(0x20),
     e: Seg3(0x08), f: Seg0(0x01), g: Seg6(0x40), dp: Seg1(0x02) */
  0xBD, /* '0' = a+b+c+d+e+f      = 0x10 + 0x80 + 0x04 + 0x20 + 0x08 + 0x01               = 0xBD */
  0x84, /* '1' =   b+c+           =        0x80 + 0x04                                    = 0x84 */
  0xF8, /* '2' = a+b  +d+e  +g    = 0x10 + 0x80 +        0x20 + 0x08 +      + 0x40        = 0xF8 */
  0xF4, /* '3' = a+b+c+d    +g    = 0x10 + 0x80 + 0x04 + 0x20 +             + 0x40        = 0xF4 */
  0xC5, /* '4' =   b+c    +f+g    =        0x80 + 0x04               + 0x01 + 0x40        = 0xC5 */
  0x75, /* '5' = a  +c+d  +f+g    = 0x10        + 0x04 + 0x20        + 0x01 + 0x40        = 0x75 */
  0x7D, /* '6' = a  +c+d+e+f+g    = 0x10        + 0x04 + 0x20 + 0x08 + 0x01 + 0x40        = 0x7D */
  0x95, /* '7' = a+b+c    +f      = 0x10 + 0x80 + 0x04               + 0x01               = 0x95 */
  0xFD, /* '8' = a+b+c+d+e+f+g    = 0x10 + 0x80 + 0x04 + 0x20 + 0x08 + 0x01 + 0x40        = 0xFD */
  0xF5, /* '9' = a+b+c+d  +f+g    = 0x10 + 0x80 + 0x04 + 0x20        + 0x01 + 0x40        = 0xF5 */
  0x02  /* '.' =               dp =  
                                                0x02 = 0x02 */
        
};

void LEDC_Configuration(void);
void GPIO_Configuration(void);
extern bool gIsUpdateChar;
void UxART_Configuration(void);
void UxART_RxTest(void);

uc8  *gURTx_Ptr;
vu32 gURTx_Length = 0;
u8  *gURRx_Ptr;
vu32 gURRx_Length = 0;
vu32 gIsTxFinished = FALSE;
u8 gRx_Buffer[10];


void LEDC_Disp(void)
{
  LEDC_SetData(HTCFG_LEDC_COM_D1, DiapBuf[0]);
  LEDC_SetData(HTCFG_LEDC_COM_D2, DiapBuf[1]);
  LEDC_SetData(HTCFG_LEDC_COM_D3, DiapBuf[2]);
  LEDC_SetData(HTCFG_LEDC_COM_D4, DiapBuf[3]);
}

int main(void)
{
  HT32F_DVB_LEDInit(HT_LED1);
  HT32F_DVB_LEDInit(HT_LED2);        
  UxART_Configuration();
  GPIO_Configuration();
  LEDC_Configuration();
  gURRx_Ptr = gRx_Buffer;
  while (1)
  {
    UxART_RxTest();

if(gIsUpdateChar)
    {
     LEDC_Disp();
     gIsUpdateChar = FALSE;
    }
               
  }
}

void UxART_Configuration(void)
{
    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
    CKCUClock.Bit.AFIO                   = 1;
    CKCUClock.Bit.HTCFG_UART_RX_GPIO_CLK = 1;
    CKCUClock.Bit.HTCFG_UART_IPN         = 1;
    CKCU_PeripClockConfig(CKCUClock, ENABLE);
  GPIO_PullResistorConfig(HTCFG_UART_RX_GPIO_PORT, HTCFG_UART_RX_GPIO_PIN, GPIO_PR_UP);
  AFIO_GPxConfig(HTCFG_UART_TX_GPIO_ID, HTCFG_UART_TX_AFIO_PIN,  AFIO_FUN_USART_UART);
  AFIO_GPxConfig(HTCFG_UART_RX_GPIO_ID, HTCFG_UART_RX_AFIO_PIN,  AFIO_FUN_USART_UART);

  {
    USART_InitTypeDef USART_InitStructure = {0};
    USART_InitStructure.USART_BaudRate = 9600;
    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_Init(HTCFG_UART_PORT, &USART_InitStructure);
  }

  NVIC_EnableIRQ(HTCFG_UART_IRQn);
  USART_IntConfig(HTCFG_UART_PORT, USART_INT_RXDR, ENABLE);
  USART_TxCmd(HTCFG_UART_PORT, ENABLE);
  USART_RxCmd(HTCFG_UART_PORT, ENABLE);
}

void LEDC_Configuration(void)
{
  LEDC_InitTypeDef LEDC_InitStruct;
  CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  CKCUClock.Bit.LEDC       = 1;
  CKCU_PeripClockConfig(CKCUClock, ENABLE);
  LEDC_InitStruct.LEDC_ClockSource    = LEDC_SRC_LSI;  
  LEDC_InitStruct.LEDC_ClockPrescaler = HTCFG_LEDC_CLOCK_PRESCAL - 1;  
  LEDC_InitStruct.LEDC_DutyClockNumber = HTCFG_LEDC_DUTY_CLOCK_NUMBER;  
  LEDC_InitStruct.LEDC_COMxEN = HTCFG_LEDC_COM1EN | HTCFG_LEDC_COM2EN |\
                                HTCFG_LEDC_COM3EN | HTCFG_LEDC_COM4EN;   
  LEDC_InitStruct.LEDC_DeadTime = 0;
  LEDC_Init(&LEDC_InitStruct);                        
  LEDC_SetPolarityMode(HTCFG_LEDC_COM1POL | HTCFG_LEDC_COM2POL | HTCFG_LEDC_COM3POL | HTCFG_LEDC_COM4POL,
                       LEDC_SEG0POL | LEDC_SEG1POL | LEDC_SEG2POL | LEDC_SEG3POL |\
                       LEDC_SEG4POL | LEDC_SEG5POL | LEDC_SEG6POL | LEDC_SEG7POL,
                       COMMON_CATHODE);

  LEDC_IntConfig(ENABLE);         
  NVIC_EnableIRQ(LEDC_IRQn);
  LEDC_Cmd(ENABLE);      
}
void GPIO_Configuration(void)
{
  CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  CKCUClock.Bit.AFIO       = 1;
  CKCU_PeripClockConfig(CKCUClock, ENABLE);

  AFIO_GPxConfig(HTCFG_LEDC_SEG0_GPIO_ID, HTCFG_LEDC_SEG0_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG1_GPIO_ID, HTCFG_LEDC_SEG1_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG2_GPIO_ID, HTCFG_LEDC_SEG2_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG3_GPIO_ID, HTCFG_LEDC_SEG3_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG4_GPIO_ID, HTCFG_LEDC_SEG4_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG5_GPIO_ID, HTCFG_LEDC_SEG5_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG6_GPIO_ID, HTCFG_LEDC_SEG6_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_SEG7_GPIO_ID, HTCFG_LEDC_SEG7_AFIO_PIN, AFIO_FUN_LEDC);


  AFIO_GPxConfig(HTCFG_LEDC_COM0_GPIO_ID, HTCFG_LEDC_COM0_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_COM1_GPIO_ID, HTCFG_LEDC_COM1_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_COM2_GPIO_ID, HTCFG_LEDC_COM2_AFIO_PIN, AFIO_FUN_LEDC);
  AFIO_GPxConfig(HTCFG_LEDC_COM3_GPIO_ID, HTCFG_LEDC_COM3_AFIO_PIN, AFIO_FUN_LEDC);
}

void UxART_RxTest(void)
{
                                                                          
  if (gURRx_Length >= 6)
  {
                DiapBuf[0]=NumberChar[(gRx_Buffer[3])&0x0f];
                DiapBuf[1]=NumberChar[(gRx_Buffer[4]>>4)&0x0f]|0x02;
                DiapBuf[2]=NumberChar[(gRx_Buffer[4])&0x0f];
                DiapBuf[3]=0xd1;
    gURRx_Length = 0;
  }
}


运行结果:

a6f31c2c5c4073cc3de032ad386e9bac










使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则