Столкнулся с странностью - при запуске USB SDADC начинает выдавать мусор. Для теста настроил SysTick, в прерываниях которого запускаю преобразование
CODE
void SysTick_Handler(void)
{
if(adc_ready)
{
adc_ready=false;
GPIO_SetBits(GPIOB, GPIO_Pin_7);
SDADC_SoftwareStartInjectedConv(SDADC1);
}
};
обработчик прерывания АЦП такой:
CODE
void SDADC1_IRQHandler(void)
{
if(SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_JEOC) != RESET) {
if(adc_ready==false)
{
adc1 = SDADC1->JDATA12R;
send_Uart(USART2,adc1>>8);
adc_ready=true;
GPIO_ResetBits(GPIOB, GPIO_Pin_7);//led off
}
SDADC_ClearITPendingBit(SDADC1, SDADC_IT_JEOC); }
}
т.е. для теста верхний байт выталкиваю во второй дебажный UART
для USB взял пример из STM32_USB-FS-Device_Lib_V4.0.0 VirtualComport_Loopback. По отдельности все работает. Одновременно - из регистра ацп лезет мусор.
Если закомментировать любую из строк инициализации USB, т.е. чтоб USB не стартовал, то получаю адекватные данные ацп. При этом при включенном USB время конверсии АЦП на порядок меньше чем при выключенном.
Set_USBClock();
USB_Interrupts_Config();
GPIO_SetBits(GPIOA, GPIO_Pin_15);//usb pull-up
USB_Init();
К сожалению отладчик здесь тоже не помогает - хост сразу откидывает девайс на паузе.
вот инициализация
CODE
int main(void)
{
Set_System();
initAll();
send_Uart(USART2,'o');// usart test
setup_sdadc();
Set_USBClock();
USB_Interrupts_Config();
GPIO_SetBits(GPIOA, GPIO_Pin_15);//usb conn
USB_Init();
while (1)
{
if (bDeviceState == CONFIGURED)
{
CDC_Receive_DATA();
if (Receive_length != 0)
{
Receive_length = 0;
command_type = Receive_Buffer[0];
... бла-бла бла мой код