找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2063|回复: 1
打印 上一主题 下一主题
收起左侧

stm8l单片机与HX711通信

[复制链接]
跳转到指定楼层
楼主
ID:648071 发表于 2019-11-23 21:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define SetPD_Sck()              GPIO_SetBits(GPIOG, GPIO_Pin_5)
#define ResetPD_Sck()            GPIO_ResetBits(GPIOG, GPIO_Pin_5)
#define ReadDout()                 GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_6)                 
#define PowDownADC()              SetPD_Sck()

void init_Hx711()
{
    /* Initialize ADC  PD_SCK:PG5   DOUT:PG6 */
    GPIO_Init(GPIOG, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);
    GPIO_Init(GPIOG, GPIO_Pin_6, GPIO_Mode_In_FL_No_IT);
    SetPD_Sck();
}

uint32_t ReadAD(void)
{
    int16_t Dat=0;
    uint8_t i;
    asm("sim"); // 关全局中断
    if(ReadDout()==0)
    {

        for( i=0; i<16; i++)
        {
            SetPD_Sck();
            ResetPD_Sck();
            if(ReadDout())
                Dat|=0x8000>>i;
        }
        for( i=0; i<9; i++)
        {
            SetPD_Sck();
            ResetPD_Sck();
        }
    }
    asm("rim"); // 开全局中断
    return Dat;
}

void USART1_Config(void)
{
    /* EVAL COM (USARTx) configuration -----------------------------------------*/
    /* USART configured as follow:
          - BaudRate = USART_BAUDRATE baud
          - Word Length = 8 Bits
          - One Stop Bit
          - No parity
          - Receive and transmit enabled
          - USART Clock disabled
    */

    /* Enable USART clock */
    /* Configure USART Tx as alternate function push-pull  (software pull up)*/
    GPIO_ExternalPullUpConfig(GPIOA, GPIO_Pin_2, ENABLE);
    /* Configure USART Rx as alternate function push-pull  (software pull up)*/
    GPIO_ExternalPullUpConfig(GPIOA, GPIO_Pin_3, ENABLE);
    SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA,ENABLE);



    /* USART configuration */
    USART_Init(USART1, 115200,
               USART_WordLength_8b,
               USART_StopBits_1,
               USART_Parity_No,
               (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));


    /* Enable general interrupts */
    enableInterrupts();

    /* Enable the USART Receive interrupt: this interrupt is generated when the USART
      receive data register is not empty */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    /* USART Disable */
    USART_Cmd(USART1, ENABLE);
}

/**
  * @brief  Configure DMA peripheral
  * @param  None
  * @retval None
  */
void UART_TX_DMA_Config(void)
{


    /* Deinitialize DMA channels */
    DMA_GlobalDeInit();

    DMA_DeInit(DMA1_Channel1);
    //DMA_DeInit(DMA1_Channel2);

    /* DMA channel Rx of USART Configuration
    DMA_Init(USART_DMA_CHANNEL_RX, (uint16_t)RxBuffer, (uint16_t)USART_DR_ADDRESS,
             DATA_TO_RECEIVE, DMA_DIR_PeripheralToMemory, DMA_Mode_Normal,
             DMA_MemoryIncMode_Inc, DMA_Priority_Low, DMA_MemoryDataSize_Byte);
    */
    /* DMA channel Tx of USART Configuration */
    DMA_Init(DMA1_Channel1, (uint16_t)USART_TxBuffer, (uint16_t)USART1->DR,
             0, DMA_DIR_MemoryToPeripheral, DMA_Mode_Normal,
             DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_Byte);

    /* Enable the USART Tx/Rx DMA requests */
     USART_DMACmd(USART1, USART_DMAReq_TX, ENABLE);

    /* Global DMA Enable */
    DMA_GlobalCmd(ENABLE);

    /* Enable the USART Tx DMA channel */
    DMA_Cmd(DMA1_Channel1, DISABLE);
    /* Enable the USART Rx DMA channel */
    //DMA_Cmd(USART_DMA_CHANNEL_RX, ENABLE);
}



void UART1_Send(uint8_t buf[],uint8_t len)
{
    if( DMA_GetCurrDataCounter(DMA1_Channel1)>0)
    {
        while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);
    }
    DMA_ClearFlag(DMA1_FLAG_TC1);
    DMA_ClearFlag(DMA1_FLAG_HT1);
    DMA_ClearITPendingBit(DMA1_IT_TC1);
    DMA_ClearITPendingBit(DMA1_IT_HT1);
    DMA_Cmd(DMA1_Channel1, DISABLE);
    memcpy(USART_TxBuffer,buf,len);
    DMA1_Channel1->CPARH = 0x52;
    DMA1_Channel1->CPARL = 0x31;
    USART_DMACmd(USART1, USART_DMAReq_TX, ENABLE);
    DMA_SetCurrDataCounter(DMA1_Channel1,len);
    DMA_Cmd(DMA1_Channel1, ENABLE);
}

/**
  * @brief  Configure System Clock
  * @param  None
  * @retval None
  */
  void CLK_Config(void)
{
    /* Select HSI as system clock source */
    CLK_SYSCLKSourceSwitchCmd(ENABLE);
    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
    /* system clock prescaler: 1*/
    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
    while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)
    {}
    /* Enable USART1 CLK */
    CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
    /* Enable USART3 CLK */
}

uint8_t Txbuff[50];
void main()
{
   CLK_Config();
   init_Hx711();
   USART1_Config();
   UART_TX_DMA_Config();
  while(1)
{
uint8_t len;
uint32_t val=ReadAD();
len=sprintf(Txbuff,"AD=%d \r\n",val);
UART1_Send(Txbuff,len);
}

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-11-23 23:02 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表