⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart.c

📁 stm32初级例程
💻 C
字号:
/*----------------------------------------------------------------------------
本例子通过串口发送AD0的值,AD0连接一个NTC温度电阻

 
用手触摸NTC温度电阻,输出数字将变化
使用我提供的串口调试工具,选择【串口超级终端】波特率设置115200
 *---------------------------------------------------------------------------*/

#include <stm32f10x_lib.h>                        // STM32F10x Library Definitions
#include <stdio.h>
#include "STM32_Init.h"                           // STM32 Initialization
#include "STM32_Reg.h"

/*----------------------------------------------------------------------------
  从串口发送一个字节数据
  Write character to Serial Port.
 *----------------------------------------------------------------------------*/
int SendChar (int ch)  {

  //等待发送结束
  while (!(USART1->SR & USART_FLAG_TXE));
  //将数据放入发送寄存器
  USART1->DR = (ch & 0x1FF);

  return (ch);
}

/*----------------------------------------------------------------------------
  从串口读取一个字节数据,直到读到数据才返回
  Read character to Serial Port.
 *----------------------------------------------------------------------------*/
int GetKey (void)  {

  //等待接收结束
  while (!(USART1->SR & USART_FLAG_RXNE));
  //从接受寄存器读取数据并返回
  return ((int)(USART1->DR & 0x1FF));
}


unsigned short int  ADC_ConvertedValue;
/*------------------------------------------------------------------------------
  Initialises the Analog/Digital converter
  PA1 (ADC Channel-0) is used as analog input
  use DMA Channel1 for ADC1 (see DMA request mapping)
  使用PA0-ADC1.0
 *------------------------------------------------------------------------------*/
void adc_Init (void) {

  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;			  //使能GPIO时钟
  //GPIO设置为模拟输入
  GPIOA->CRL &= ~0x00000000;
  GPIOA->CRH &= ~0x00000000;
  
  // enable periperal clock for DMA
  //使能DMA时钟
  RCC->AHBENR |= (1<<0);
  // set channel1 memory address   
  //设置DMA内存地址,ADC转换结果直接放入该地址
  DMA1_Channel1->CMAR  = (u32)&ADC_ConvertedValue;
  // set channel0 peripheral address
  //设置通道1外设地址
  DMA1_Channel1->CPAR  = (u32)&(ADC1->DR);
  // transmit 1 word
  //DMA传送1个字
  DMA1_Channel1->CNDTR = 1;
  // configure DMA channel
  DMA1_Channel1->CCR   = 0x00002520;
  // DMA Channel 1 enable	   //使能DMA通道
  DMA1_Channel1->CCR  |= (1 << 0);                

  // enable periperal clock for ADC1  
  //使能ADC时钟
  RCC->APB2ENR |= (1<<9);
  // only one conversion   // 只有1个转换通道
  ADC1->SQR1  = 0x00000000;
  // set sample time channel0 (55,5 cycles)// (3bit)
  //通道1采样周期55.5个时钟周期
  ADC1->SMPR2 = 0x00000028;
  // set channel1 as 1st conversion	// (5bit)
  //第1个转换通道是1通道
  ADC1->SQR3  = 0x00000000;
  // use independant mode, SCAN mode
  //使用独立模式,扫描模式
  ADC1->CR1   = 0x00000100;
  // use data align right,continuous conversion
  //使用数据右对齐,连续转换
  ADC1->CR2   = 0x000E0103;
  // EXTSEL = SWSTART 
  // enable ADC, DMA mode, no external Trigger
  // start SW conversion
  //允许ADC,DMA模式,无需外接触发器
  //开始转换
  ADC1->CR2  |=  0x00500000;					  
}

//软件延时,非精确延时
void Delay(unsigned long time)
{unsigned long i,j;
  
	for(j=0; j<time; j++)
	{
	   for(i=0;i<12000;i++);
	}
}
/*----------------------------------------------------------------------------
  MAIN function
 *----------------------------------------------------------------------------*/
int main (void)
{
int AD_value;
  
  // STM32 setup
  //STM32初始化
  stm32_Init ();
  //ADC初始化
  adc_Init();
  printf ("ADC Example\r\n\r\n");

  while (1) 
  {
	   //Delay(1000);
	   
	   //为了方便观察软件仿真好观察采用下面的延时
	   Delay(50);
	   //因为使用DMA操作,所以每次ADC转换结束,ADC的值都被保存到ADC_ConvertedValue里
	   AD_value  = ADC_ConvertedValue;
	   //这里可以通过串口看到ADC的值
	   printf("AD value = 0x%04X\r\n", AD_value);
  } // end while
} // end main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -