Н-да.. вы были правы. В IAR все работает.
Продолжаю мучить контроллер.
По нажатию одной из кнопок вхожу в режим halt.
Другой кнопкой хочу выводить из этого режима. Настроено прерывание по спаду на эту кнопку.
В принципе все работает - кнопку нажал, контроллер заснул. Нажал другую - контроллер пронулся и пошел дальше работать.
Добавил я в цикл основную задачу - измерение напряжения и вывод его на экран. И вот тут-то пошли проблемы - контроллер по нажатию на вторую кнопку просыпается, но зависает в функции работы с АЦП в виделенной жирным строке:
CODE
// ------------ ADC1 -------------------
uint16_t GetADCvalue(uint8_t ChanelNumb)
{
uint16_t tmphvalue;
uint16_t tmplvalue;
ADC1->CSR = ChanelNumb; // channel
delay(10);
ADC1->CR1 |= 0x61;
while(!(ADC1->CSR & ADC1_CSR_EOC)){;}
ADC1_ClearITPendingBit(ADC1_IT_EOC);
tmplvalue = ADC1->DRL;
tmphvalue = (uint16_t)ADC1->DRH << 8;
tmphvalue = tmphvalue + tmplvalue;
return (tmphvalue);
}
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
w=0;
}
void main(void)
{
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); // set 16 MHz for CPU
GPIO_DeInit(BACKLIGHT_PORT);
GPIO_Init(BACKLIGHT_PORT, BACKLIGHT, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteHigh(BACKLIGHT_PORT, BACKLIGHT);
GPIO_Init(PWR_BTN_PORT, PWR_BTN, GPIO_MODE_IN_PU_NO_IT);
//EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA, EXTI_SENSITIVITY_FALL_ONLY);
GPIO_Init(MENU_BTN_PORT, MENU_BTN, GPIO_MODE_IN_PU_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
GPIO_DeInit(IO_PORT);
GPIO_Init(IO_PORT, STB|SCLK|DIO|TM1722_POWER, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteHigh(BACKLIGHT_PORT, BACKLIGHT);
GPIO_WriteHigh(IO_PORT, TM1722_POWER);
ADC1_Config();
enableInterrupts();
LCD_Clear(0);
while(1)
{
adc=GetADCvalue(4);
ADC_Voltage=adc*(5.0/1024)*20;
LCD_Show_Voltage(ADC_Voltage);
if (GPIO_ReadInputPin(GPIOA,GPIO_PIN_2))
{
LCD_Show_Spark(0);
}
else
{
LCD_Show_Spark(1);
halt();
}
}
Заметьте, я вхожу в halt аккуратно - не по прерыванию, а по чтению кнопки после того, как АЦП завершил работу.
Сам АЦП инициализирован так
Код
/ ------------ ADC1 -------------------
void ADC1_Config(void)
{
GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_FL_NO_IT);
ADC1->CR1 = 0x61; // 0b01100001; // enable ADC
ADC1->CR2 = 0x08; // 0b00001000; // right otygnment
ADC1->CR3 = 0x00; // 0; // data bufer disable
ADC1->TDRL = 0xC0; // 0b11000000; // disable Schmitt triggers for AIN7 & AIN6
}
Я решил эту проблему просто - перед halt() выключаю АЦП, после просыпания тут же включаю. Но что-то мне это кажется полумерой. Почему присходит сбой, так и должно быть?
Сообщение отредактировал zheka - Aug 13 2018, 19:20