STM32通过串口赋值控制DAC输出
通过串口调试助手给stm32的串口发送一个数值,串口读到值以后,将该值给到DAC,使DAC输出该电压
串口初始化
#include "usart1.h"
#include "sys.h"
#include "led.h"
#include "stdio.h"
u16 i;
u8 USART1_RX_BUFF[3];
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0){};//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
static void Nvic_config()
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
}
void Usart1_config()
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//RT接受浮空输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitStruct.USART_BaudRate=9600;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1, &USART_InitStruct);
Nvic_config();
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
void TX_config(u8 data)
{
USART_SendData(USART1,data);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
/*发送一个数组*/
void TX_array(u8 *array,u8 num)
{
u8 i;
for(i=0;i<num;i++)
{
USART_SendData(USART1,array[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
void TX_str(u8* str)
{
//u8 i=0;
do
{
USART_SendData(USART1,*(str++));
//i++;
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}while(*(str)!='\0');
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
void USART1_IRQHandler(void)
{
//u8 i;
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=RESET)
{
USART1_RX_BUFF[i]= USART_ReceiveData(USART1);
i++;
if(i==3)
{i=0;}
}
TX_config(USART1_RX_BUFF[i]);
}
DAC初始化
#include "dac.h"
#include "sys.h"
void DAC_init()
{
GPIO_InitTypeDef GPIO_InitStruct;
DAC_InitTypeDef DAC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude=DISABLE;
DAC_InitStruct.DAC_OutputBuffer=DAC_OutputBuffer_Disable;
DAC_InitStruct.DAC_Trigger=DAC_Trigger_None;
DAC_InitStruct.DAC_WaveGeneration=DAC_WaveGeneration_None;
DAC_Init(DAC_Channel_1,&DAC_InitStruct);
DAC_SetChannel1Data(DAC_Align_12b_R,0);
DAC_Cmd(DAC_Channel_1,ENABLE);
}
//value 0~3300
void Set_DAC(u16 value)
{
float temp;
temp=value/1000;
value=temp*4096/3.3;
DAC_SetChannel1Data(DAC_Align_12b_R,value);
}
主函数逻辑
#include "sys.h"
#include "delay1.h"
#include "usart1.h"
#include "led.h"
#include "stdio.h"
#include "dma.h"
#include "dac.h"
float V;
extern u16 i;
extern u16 ADC_VALUE[3];
u8 USART_arry[5];
extern u8 USART1_RX_BUFF[3];
u8 arry[3];
int main(void)
{
int a;
u16 value;
RCC_config();
ADC1_Init();
LED_Init();
dma_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Usart1_config();
DAC_init();
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(1){
if(USART1_RX_BUFF[0]==0x01 )
{
value=USART1_RX_BUFF[1];
value<<=8;
value|=USART1_RX_BUFF[2];
Set_DAC(value);
}
V=Get_Value();
printf("%f\r\n",V);
}
}
串口输入值格式
使用十六进制发送,以0x01开头