📄 usart.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 + -