打印

【试用】F207ZE+ADC+DMA+USART+DAC加上DS18B20

[复制链接]
1656|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 胡斯哲 于 2016-4-22 18:52 编辑

一、F207ZE+ADC+DMA+USART+DAC
就不用嗮板子了直接上程序。用keil5.14
#include "gd32f20x.h"
#include <stdlib.h>
#include <stdio.h>

/* Private define ------------------------------------------------------------*/
#define ADC1_DR_Address ((uint32_t)0x4001244C)
/* Private variables ---------------------------------------------------------*/
float ADC_Value;
int i;
float vu16Temperature;
__IO uint16_t ADCConvertedValue;

ADC_InitPara ADC_InitStructure;
DAC_InitPara DAC_InitStructure;
DMA_InitPara DMA_InitStructure;
/* Private function ----------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void ADC_Configuration(void);
void Dac1_Init(void);
void Dac1_Set_Vol(u16 vol);

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
/* __GNUC__ */

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
    /* Config System clocks --------------------------------------------------*/
    RCC_Configuration();
    /* Config GPIO ports -----------------------------------------------------*/
    GPIO_Configuration();
    USART_Configuration();
    ADC_Configuration();
          Dac1_Set_Vol(1500);
    //while(ADC_GetBitState(ADC1,ADC_FLAG_EOC) != SET);
    //ADC_Value = ADC_GetConversionValue(ADC1);
    vu16Temperature = ADCConvertedValue*3.3/4096;
    printf("\n\rTemperature %f\n\r",vu16Temperature);
    while (1);
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Configure system clocks.
  * @param  None
  * @retval None
  */
void RCC_Configuration(void)
{
    /* ADCCLK = PCLK2/6 */
    RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6);

    /* Enable DMA1 and GPIOC clock */
    RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_AF , ENABLE);
    /* Enable USART1 APB clock */
    RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_USART1 , ENABLE );
    /* Enable ADC1 clock */
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_ADC1, ENABLE);
          RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_DMA1, ENABLE);
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Configure GPIO ports.
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
    GPIO_InitPara GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Configure ADC Configuration.
  * @param  None
  * @retval None
  */
void ADC_Configuration(void)
{
          DMA_DeInit(DMA1_CHANNEL1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC;
    DMA_InitStructure.DMA_BufferSize = 1;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
    DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_DISABLE;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_HALFWORD;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORYDATASIZE_HALFWORD;
    DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR;
    DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH;
    DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
    DMA_Init(DMA1_CHANNEL1, &DMA_InitStructure);
    /* Enable DMA1 channel1 */
    DMA_Enable(DMA1_CHANNEL1, ENABLE);
    /* Config ADC1 --------------------------------------------------------------*/
    ADC_InitStructure.ADC_Mode_Scan = DISABLE;
    ADC_InitStructure.ADC_Mode_Continuous = DISABLE;
    ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
    ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
    ADC_InitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;
    ADC_InitStructure.ADC_Channel_Number = 1;
    ADC_Init(ADC1,&ADC_InitStructure);

    /* ADC1 regular channels configuration */
    ADC_RegularChannel_Config(ADC1,ADC_CHANNEL_13, 1, ADC_SAMPLETIME_239POINT5);

    ADC_ExternalTrigConv_Enable(ADC1,ENABLE);
    ADC_TempSensorVrefint_Enable(ENABLE);
    /* Enable ADC1 DMA */
    ADC_DMA_Enable(ADC1, ENABLE);
    /* Enable ADC1 */
    ADC_Enable(ADC1,ENABLE);
    ADC_Calibration(ADC1);

    /* Start ADC1 Software Conversion */
    ADC_SoftwareStartConv_Enable(ADC1,ENABLE);
}


/**
  * @brief  Configure USART parameter.
  * @param  None
  * @retval None
  */
void USART_Configuration(void)
{
    USART_InitPara USART_InitStructure;
          GPIO_InitPara  GPIO_InitStructure;
    RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOB, ENABLE );
    /* Enable USART1 APB clock */
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1, ENABLE );
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF, ENABLE);
    GPIO_InitStructure.GPIO_Pin     = GPIO_PIN_6 ;
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Speed   = GPIO_SPEED_50MHZ;
    GPIO_Init( GPIOB , &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin     = GPIO_PIN_7;
    GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_IN_FLOATING;;
    GPIO_Init( GPIOB , &GPIO_InitStructure);

    GPIO_PinRemapConfig(GPIO_REMAP_USART1, ENABLE);
    USART_DeInit( USART1 );
    USART_InitStructure.USART_BRR = 115200;
    USART_InitStructure.USART_WL = USART_WL_8B;
    USART_InitStructure.USART_STBits = USART_STBITS_1;
    USART_InitStructure.USART_Parity = USART_PARITY_RESET;
    USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
    USART_InitStructure.USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX;
    USART_Init(USART1, &USART_InitStructure);
    /* USART enable */
    USART_Enable(USART1, ENABLE);
}

void Dac1_Init(void)
{  
  GPIO_InitPara  GPIO_InitStructure;
        DAC_InitPara DAC_InitType;
        
  RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOA, ENABLE);//??GPIOA??
  RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_DAC, ENABLE);//??DAC??
           
  GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AIN;//????
  //GPIO_InitStructure.GPIO_PuPd = GPIO_MODE_OUT_PP;//??
  GPIO_Init(GPIOA, &GPIO_InitStructure);//???

        DAC_InitStructure.DAC_Trigger=DAC_TRIGGER_NONE;        //??????? TEN1=0
        DAC_InitType.DAC_WaveType=DAC_WAVEGENE_NONE;//???????
        DAC_InitType. DAC_LFSRNoise_AmplitudeTriangle=DAC_LFSR_BIT0 ;//???????
        DAC_InitType.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE  ;        //DAC1?????? BOFF1=1
  DAC_Init(DAC_CHANNEL_2,&DAC_InitType);         //???DAC??1

        DAC_DMA_Enable(DAC_CHANNEL_2, ENABLE);  //??DAC??1
  
  DAC_SetChannel1Data(DAC_ALIGN_12B_R, 0);  //12??????????DAC?
}
//????1????
//vol:0~3300,??0~3.3V
void Dac1_Set_Vol(u16 vol)
{
        double temp=vol;
        temp/=1000;
        temp=temp*4096/3.3;
        DAC_SetChannel1Data(DAC_ALIGN_12B_R,temp);//12??????????DAC?
}


/**
  * @brief  Retarget the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
    /* Loop until transmit data register is empty */
    while (USART_GetBitState( USART1 , USART_FLAG_TBE) == RESET)
    {
    }
    /* Place your implementation of fputc here */
    USART_DataSend( USART1 , (uint8_t) ch );
    return ch;
}
截取串口图片

对于这块板子总体感觉调的也很顺利,跟stm32差不多。特别是板子上有现成的串口,还是很方便。之前用stm32f030discovery没现成串口,好多功能都没法用。
二、将STM32F030的DS18B20的程序直接改为GD上
前段时间忙工作的事,没弄板子,今天调了下板子。虽然当中有些奇怪的问题出现,但基本都属于操作不熟练。这次修改基本没有什么改动,只是头文件和加上了串口,精确延时还是用的stm32的systick,可以不用动。
在网上看到说板子丝印标的不对,我感觉没问题,对照下图可以测测
需要改动的地方
1)、GD用的是GPIOA_PIN1(这个stm32用GPIO_Pin),
2)、RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);-------》RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOA, ENABLE);
3)、GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;和GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;合并为一句GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_OD;
4)、GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1改为GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
其他没变化
硬件图

串口截图

程序
gd3218b20.rar (360.71 KB)
确实感觉stm32可以被GD32取代哦

  
沙发
弈涯| | 2016-4-7 10:03 | 只看该作者
太棒了

使用特权

评论回复
板凳
胡斯哲|  楼主 | 2016-4-7 14:21 | 只看该作者
弈涯 发表于 2016-4-7 10:03
太棒了

使用特权

评论回复
地板
yaoxihua| | 2016-4-10 21:38 | 只看该作者
能搞个定时器中断的例程吗

使用特权

评论回复
5
胡斯哲|  楼主 | 2016-4-11 19:59 | 只看该作者
yaoxihua 发表于 2016-4-10 21:38
能搞个定时器中断的例程吗

最近有点事  没弄了  有时间再分享

使用特权

评论回复
6
chuntian2016| | 2016-4-12 18:06 | 只看该作者
这个程序非常不错的,AD采集数据经过处理后再以DA的方式输出模拟信号。

使用特权

评论回复
7
zhangbo1985| | 2016-4-16 11:17 | 只看该作者
这个程序很不错,再多综合下的,就可以做一个复杂点的项目的额

使用特权

评论回复
8
smilingangel| | 2016-4-16 12:22 | 只看该作者
看这个程序的操作跟STM32没多大区别的。

使用特权

评论回复
9
胡斯哲|  楼主 | 2016-4-16 16:46 | 只看该作者
smilingangel 发表于 2016-4-16 12:22
看这个程序的操作跟STM32没多大区别的。

确实没多大差别  可能就结构体名字不同

使用特权

评论回复
10
胡斯哲|  楼主 | 2016-4-16 16:47 | 只看该作者
zhangbo1985 发表于 2016-4-16 11:17
这个程序很不错,再多综合下的,就可以做一个复杂点的项目的额

也想  可是最近没时间

使用特权

评论回复
11
angerbird| | 2016-4-16 21:03 | 只看该作者
该程序的条理比较清楚,跟STM32的差不多的。

使用特权

评论回复
12
comeon201208| | 2016-4-17 12:36 | 只看该作者
这个程序还是比较基础性的,先是AD采集的然后进行数据处理后再DA输出的。

使用特权

评论回复
13
胡斯哲|  楼主 | 2016-4-17 13:14 | 只看该作者
comeon201208 发表于 2016-4-17 12:36
这个程序还是比较基础性的,先是AD采集的然后进行数据处理后再DA输出的。

先da后ad的

使用特权

评论回复
14
comeon201208| | 2016-4-17 13:26 | 只看该作者

哦,这个程序的主要看main函数部分的,不太容易看出这个先后的,我这就思维定式的了

使用特权

评论回复
15
胡斯哲|  楼主 | 2016-6-28 15:39 | 只看该作者

使用特权

评论回复
16
lisingch| | 2016-6-29 17:56 | 只看该作者
不错,研究学习一下。

使用特权

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

本版积分规则

个人签名:读书喝茶,不争朝夕

141

主题

1431

帖子

6

粉丝