LAUNCHXL-F28069MとBOOSTXL-DRV8305EVMでSCIを使うとき、問題を避けるためにADCの割り込み優先順位を上げる方法
TiのC2000Piccoloの割り込みは、独自のPIEテーブルとかいうものに基づいたもので、とても分かりにくく使いにくいです。
C2000シリーズではPIEテーブルの順序の変更も容易ではなく(掲示板にはデキナイ、との書き込みも)、さらにその定義も小首を傾げたくなるような順序に並んでいます。
InstaSPINモータドライバを使うとき、ADCがフル稼働しているのですが、標準だとこの優先順位がSCI(UART)よりも低く設定されているため、SCI割り込みが入るとモータが動かせないという謎仕様です。
ただし、これは問題を知っていれば簡単に回避できます。
参考資料
このスレッドなどを参考に。
level interrupts in motorware_12 - InstaSPIN Motor Solutions Forum - C2000™ Microcontrollers - TI E2E Community
割り込みトリガーをADC_IntNumber_1からADC_IntNumber_1HP(High Priority)に変更
なぜか、同じADCに優先順位の設定が2つ割り当てられていて、10番(標準)と1番(優先)です。
デフォルトで10番に割り当てられているものを1番のPIEで駆動されるように変更します。
hal.c
void HAL_enableAdcInts(HAL_Handle handle) { HAL_Obj *obj = (HAL_Obj *)handle; // enable the PIE interrupts associated with the ADC interrupts PIE_enableAdcInt(obj->pieHandle,ADC_IntNumber_1HP); // ADC_IntNumber_1 to ADC_IntNumber_1HP // enable the ADC interrupts ADC_enableInt(obj->adcHandle,ADC_IntNumber_1); // enable the cpu interrupt for ADC interrupts CPU_enableInt(obj->cpuHandle,CPU_IntNumber_1); // CPU_IntNumber_10 to CPU_IntNumber_1 return; } // end of HAL_enableAdcInts() function
hal.h
static inline void HAL_initIntVectorTable(HAL_Handle handle) { HAL_Obj *obj = (HAL_Obj *)handle; PIE_Obj *pie = (PIE_Obj *)obj->pieHandle; ENABLE_PROTECTED_REGISTER_WRITE_MODE; pie->ADCINT1_HP = &mainISR; // pie->ADCINT1 to pie->ADCINT1_HP //pie->SCIRXINTA = &sciarxISR; DISABLE_PROTECTED_REGISTER_WRITE_MODE; return; } // end of HAL_initIntVectorTable() function
hal.h
static inline void HAL_acqAdcInt(HAL_Handle handle,const ADC_IntNumber_e intNumber) { HAL_Obj *obj = (HAL_Obj *)handle; // clear the ADC interrupt flag ADC_clearIntFlag(obj->adcHandle,intNumber); // Acknowledge interrupt from PIE group 1 PIE_clearInt(obj->pieHandle,PIE_GroupNumber_1); // PIE_GroupNumber_10 to PIE_GroupNumber_1 return; } // end of HAL_acqAdcInt() function
これでも、SCITX割り込みがうまく動かない。なんでた”~。