Como usar a interrupção ADC na pílula azul STM32
Atualmente estou usando as placas STM32F1xx da http://dan.drown.org/stm32duino/package_STM32duino_index.jsonPara programar minha pílula azul, mas não consigo encontrar como escrever a interrupção para o ADC. Eu configurei os registradores para gerar uma interrupção quando terminar, mas não consigo descobrir como escrever o código para a interrupção.
Eu tentei a função ”ISR (ADC_vect)” que funciona para arduino, mas o compilador está reclamando que “ISR” não é reconhecido. Tentei procurar a documentação do STM32duino, mas o pouco que consegui encontrar nem mencionava o ADC ou quaisquer rotinas de interrupção. Eu pesquisei no fórum STM32duino sem qualquer sorte. Se alguém souber como resolver isso ou onde encontrar informações sobre o código de interrupção para as placas STM32 eu ficaria muito feliz :)
Respostas
Como você já descobriu, a função a ser substituída é __irq_adc()definida fracamente aqui e vinculada à tabela de vetores de interrupção aqui .
Se você o definiu e não está funcionando, provavelmente é porque você se livrou attachInterrupt()totalmente da chamada, o que faz mais do que apenas atribuir um manipulador de interrupção; também habilita a interrupção para aquele ADC. Assim:
myADC.calibrate();
myADC.setSampleRate(ADC_SMPR_1_5);
adc_enable_irq(ADC1, ADC_EOC);
myADC.setPins(&pin, 1);
extern "C" void __irq_adc() {
// handle the interrupt
// make sure to check statuses and clear flags as shown in the default handler
}
Não tenho certeza se o extern "C"será necessário, provavelmente será, você terá que verificar e descobrir.
Não consegui encontrar a função sendo chamada diretamente, mas há um bom exemplo que explica como anexar interrupções ao ADC que funciona bem: https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/STM32ADC/examples/SingleConversionInterrupt/SingleConversionInterrupt.ino
Se alguém souber a função real sendo chamada diretamente, seria ótimo adicionar aqui, mas até então este exemplo faz o que eu preciso e espero ajudar outras pessoas com o mesmo problema.
primeiro você precisa habilitar a interrupção (não sei se o wrapper stm32 para arduino faz isso ou não):
NVIC_EnableIRQ(ADC1_IRQn);
então você tem que escrever ISR como gerben disse:
extern "C" void ADC1_IRQHandler()
{
//clear ADC flag
}
extern "C" porque [pelo que eu sei] os projetos do arduino são C ++.