#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"
void adc_init(void) ;
void USART_Initaize(u32 pclk2,u32 bound);
void Uart1_PutChar(u8 ch);
void Uart1_PutString(u8 *Buf, u8 Len);
int find_phrase(float *a,float *b,u16 Ts);
u16 get_adc(void);
//主函数内容
int main(void)
{
u32 temp;
u16 adcx;
u8 table[4];
u8 *p;
p= table;
Stm32_Clock_Init(9);//88M
delay_init(72); //延迟初始化
USART_Initaize(72,9600); //设置波特率
adc_init();
while (1)
{
adcx=get_adc();
temp=adcx*330/4096;
adcx=temp;
table[0]=adcx / 100 + 0x30;
table[1]='.';
table[2]=adcx % 100/10 + 0x30;
table[3]= adcx %10 + 0x30;
Uart1_PutString(p,4);
Uart1_PutString("
",2);
}
}
void adc_init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
GPIOA->CRL&=0XFFFFFFF0;//PA.0 anolog输入
//ͨµÀ10/11ÉèÖÃ
RCC->APB2ENR|=1<<9; //ADC1时钟使能
__nop();
__nop();
RCC->APB2RSTR|=1<<9; //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR|=3<<14; //SYSCLK/DIV2=88M/8=11Mhz µÃµ½ADC²ÉÑùÂÊλ43.65Khz
ADC1->CR1&=0XF0FFFF; //工作模式清0
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1&=~(1<<8); //非扫描方式
ADC1->CR2&=~(1<<1); //单次转换模式
ADC1->CR2|=0x000E0000; //软件控制转换,由bit21控制
ADC1->CR2|=1<<20; //使用用外部触发(SWSTART),必须使用一个事件触发
ADC1->CR2&=~(1<<11); //右对齐
ADC1->SQR1&=0xFFF0FFFF;//1个转换在规则序列中
ADC1->SQR3&=0XFFFFFFE0;//规则序列1=通道0
ADC1->SQR3|=0;
ADC1->SMPR2&=0XFFFFFFF8;//通道0采样时间清空
ADC1->SMPR2|=0X07; //通道0转换时间为:239.5+12.5个ADC时钟周期
ADC1->CR2|=1<<0; //开启AD转换器,第一次唤醒AD转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
ADC1->CR2&=~(1<<8); //不开启ADC DMA转换
ADC1->CR2|=1<<0; //开启AD转换
}
//获得ADC值
u16 get_adc(void)
{
ADC1->CR2|=1<<22; //启动规则转换通道
while(!(ADC1->SR&1<<1));//等待转换结束
return ADC1->DR; //返回ADC值
}
void USART_Initaize(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校检位
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
void Uart1_PutChar(u8 ch)
{
USART1->DR = (u8) ch;
while((USART1->SR&0X40)==0);/循环发送,直到发送完毕
}
void Uart1_PutString(u8 *Buf, u8 Len)
{
u8 i;
for(i= 0; i<Len; i++)
{
Uart1_PutChar(*Buf++);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>