?? 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 + -