简短版本:
需要帮助C编程在STM32F3(Dicovery板)中为ADC选择通道/ s。请在问题的最后找到我现在编写的代码。如果有人可以参考一些资源进行裸机编程,那就太好了。
长版:
我正在学习编程ARM控制器;我所拥有的是ST32F303发现板,我相信我尝试的方法称为裸机编程。我有为AVR微控制器编写普通C代码的经验,但这非常简单,几乎所有寄存器在整个系列中都是相同的。但是当涉及到ARM时,我完全惊讶地发现,即使正确编译代码,我们也必须正确处理事物(文件)的数量。顺便说一下,我有一个Linux系统,所以我将gnu arm toolchain与Eclipse放在一起。
经过一些研究和许多Youtube视频后,我最终确定了两种材料
当然我也指的是控制器的参考手册。但问题是上述两种资源都不是stm32F3的直接资源,但我使用相同的工作流程来编写F3。现在我被ADC困住,因为我无法弄清楚如何选择转换频道,一些建议和指导会有所帮助
这是我到目前为止编写的代码
/*
* ADC in ARM
*
* Author : Easwaran
*
*/
#include "stm32f30x_conf.h"
int main (void)
{
//ADC calibration
ADC1->CR &= ~ADC_CR_ADEN; //Disables ADC; 0 in ADCEN to disable ADC.
// ADC1->CR
ADC1->CR |= ADC_CR_ADCAL; //put a 1 in calibration register | CR is the control register for ADC1
while ((ADC1->CR & ADC_CR_ADCAL) != 0)
{
//waiting till the calibration is over; ie the bit turns 0
}
//select a clock source
RCC->AHBENR |= RCC_AHBENR_ADC12EN; // enables both ADC1 & 2
RCC->CR |= RCC_CR_HSEON;
while((RCC->CR & RCC_CR_HSERDY) != 1)
{
//to make sure the clock has started
}
ADC1->CR = ADC12_CCR_CKMODE; // this is weird
// enable ADC
ADC1-> CR = ADC_CR_ADEN;
while((ADC1->ISR & ADC_ISR_ADRD) == 0)
{
//waiting to get ready
}
//sampling time
ADC1->SMPR1 |= ADC_SMPR1_SMP0_0 | ADC_SMPR1_SMP0_1 | ADC_SMPR1_SMP0_2;
//set the channel - here internal temp register
while(1)
{
//start conversion
}
}