M69002400 2024-07-19 11:31 采纳率: 0%
浏览 9
已结题

DAC函数和STM32

#include "myusart.h"
#include "string.h"
#include "stdio.h"

uint8_t USART1_RX_BUF[USART1_REC_LEN];//½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
uint16_t USART1_RX_STA=0;//½ÓÊÕ״̬±ê¼Ç//bit15£º½ÓÊÕÍê³É±êÖ¾£¬bit14£º½ÓÊÕµ½0x0d£¬bit13~0£º½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
uint8_t USART1_NewData;//µ±Ç°´®¿ÚÖжϽÓÊÕµÄ1¸ö×Ö½ÚÊý¾ÝµÄ»º´æ
uint32_t hex_to_decimal(uint8_t *hex_array, uint16_t length);
char receivedHex[3] = {0}; // ´æ´¢½ÓÊÕµ½µÄÁ½¸ö16½øÖÆ×Ö·ûºÍÒ»¸ö½áÊø·û

uint8_t USART2_RX_BUF[USART2_REC_LEN];//½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
uint16_t USART2_RX_STA=0;//½ÓÊÕ״̬±ê¼Ç//bit15£º½ÓÊÕÍê³É±êÖ¾£¬bit14£º½ÓÊÕµ½0x0d£¬bit13~0£º½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
uint8_t USART2_NewData;//µ±Ç°´®¿ÚÖжϽÓÊÕµÄ1¸ö×Ö½ÚÊý¾ÝµÄ»º´æ
uint8_t RS485orBT;//µ±RS485orBT±ê־λΪ1ʱÊÇRS485ģʽ£¬Îª0ʱÊÇÀ¶ÑÀģʽ

uint8_t USART3_RX_BUF[USART3_REC_LEN];//½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
uint16_t USART3_RX_STA=0;//½ÓÊÕ״̬±ê¼Ç//bit15£º½ÓÊÕÍê³É±êÖ¾£¬bit14£º½ÓÊÕµ½0x0d£¬bit13~0£º½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
uint8_t USART3_NewData;//µ±Ç°´®¿ÚÖжϽÓÊÕµÄ1¸ö×Ö½ÚÊý¾ÝµÄ»º´æ
int decimalNumber=0;
int i=0;
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}


uint8_t My_RXData;
void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//´®¿ÚÖжϻص÷º¯Êý
{
    if(huart ==&huart1)//ÅжÏÖжÏÀ´Ô´£¨´®¿Ú1£ºUSBת´®¿Ú£©
    {
       My_RXData = USART1_NewData;
       HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); //ÔÙ¿ªÆô½ÓÊÕÖжÏ
    }
```c
#include "dac711.h"
#include "string.h"
#include "stdio.h"
uint16_t cnum;
void delay(uint8_t us)
{
    for(; us !=0; us--);
}

void DAC7311_Init(void)
{
    AO1_SYNC_H();
    AO1_SCLK_L();
}

void AO1_Write(uint16_t Data)
{
    uint8_t temp;
    uint8_t    ui;
    
    temp=Data << 2;//7311ÐèÒªÒÆÁ½Î»
    temp &= 0x3FFF;//Ñ¡ÔñģʽΪNormal
    AO1_SYNC_H();
    AO1_SCLK_H();
    delay(10);
    AO1_SYNC_L();//ʹÄÜÊäÈëÒÆλ¼Ä´æÆ÷
    delay(10);
    
    for(ui=0; ui<16; ui++)
    {
        
        AO1_SCLK_H();
        
        if(0x8000 == (temp & 0x8000))
        {
            AO1_DIN_H();
        }
        else
        {
            AO1_DIN_L();
        }
        delay(10);
        AO1_SCLK_L();
        delay(10);
        temp <<=1;
    }
    
    AO1_SYNC_H();

}
```c

#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "dac711.h"
#include "myusart.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
extern   uint8_t USART1_NewData;
 extern   uint8_t My_RXData;

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  DAC7311_Init();
    HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1);
 

     /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  
  while (1)
  {
    /* USER CODE END WHILE */
    
        AO1_Write(My_RXData);
        USART1_NewData = 0;
        /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

```

```主函数代码中是USART1_NewData = 0还是My_RXData=0呢,My_RXData是8位数据,但是DAC函数中AO1_Write是16位数据,直接写AO1_Write(My_RXData)会有问题吗,有的话怎么把8位转换成16位呢,这些代码能实现数据接收并写入DAC让DAC进行处理吗,详细解读一下代码

  • 写回答

13条回答 默认 最新

  • 阿里嘎多学长 2024-07-19 11:31
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    你的代码和问题已经非常详细,我会逐步解答你的问题,并提供一些建议。

    1. 确定主函数中是否应该将 USART1_NewData 设置为0还是 My_RXData 设置为0

    在主函数中,接收到数据后应该将 USART1_NewData 清零,以便下一次接收。因此,正确的做法是在每次接收完数据后将 USART1_NewData 设置为0。这样可以确保在下一次接收中断触发时,USART1_NewData 能够正确地接收新的数据。

    2. 解决 My_RXData 为8位数据而 AO1_Write 函数需要16位数据的问题

    My_RXData 是8位数据,而 AO1_Write 函数需要16位数据。你可以通过将 My_RXData 左移8位,然后再与自身进行或运算来实现扩展。例如:

    uint16_t data16 = (My_RXData << 8) | My_RXData;
    AO1_Write(data16);
    

    这样,My_RXData 的值会被复制到高8位和低8位,从而形成一个16位的数据。

    3. 确保代码能够实现数据接收并写入DAC进行处理

    代码中已经包含了USART的初始化和接收中断配置,确保数据能够被接收。DAC初始化和写入函数也已经配置好,确保数据能够被写入DAC。以下是一些关键点和建议:

    • USART初始化和接收中断:确保 MX_USART1_UART_Init() 等函数正确初始化了USART,并配置了接收中断。
    • DAC初始化DAC7311_Init() 函数需要正确初始化DAC。
    • 主循环中的数据处理:在主循环中,需要检查 USART1_NewData 是否有新数据,并将其写入DAC。

    修改后的代码示例

    以下是修改后的代码示例,确保数据接收和DAC写入的逻辑正确:

    #include "main.h"
    #include "tim.h"
    #include "usart.h"
    #include "gpio.h"
    #include "dac711.h"
    #include "myusart.h"
    
    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART1_UART_Init();
      MX_USART2_UART_Init();
      MX_USART3_UART_Init();
      MX_TIM2_Init();
      /* USER CODE BEGIN 2 */
      DAC7311_Init();
      HAL_UART_Receive_IT(&huart1, (uint8_t *)&USART1_NewData, 1);
    
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        if (USART1_NewData != 0) {
          uint16_t data16 = (USART1_NewData << 8) | USART1_NewData; // 将8位数据扩展为16位
          AO1_Write(data16); // 写入DAC
          USART1_NewData = 0; // 清零以准备下一次接收
        }
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    

    总结

    • 清零 USART1_NewData:每次接收完数据后,将 USART1_NewData 清零。
    • 扩展数据:将8位数据扩展为16位,然后写入DAC。
    • 确保逻辑正确:在主循环中检查数据接收并处理。

    这样修改后,代码能够正确地接收数据,将8位数据扩展为16位,并写入DAC进行处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月19日
  • 创建了问题 7月19日