03.08.2012, 09:28
|
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от st__1
|
А через UART???
|
через UART медленно (1200 бод) но шьется Write/read protection снял на всякий случай. Frimware перепрошил V2.J15.S0. Чип определяется как Device: STM32F4xx Device ID: 0x413 Revizion: Rev Z.
Читать может, Compare with file тоже работает. А вот при записи вылетает Timeout during flash programming...
|
|
|
|
03.08.2012, 14:19
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Всем доброго времени суток!
Такая проблемка: использую STM32f103VG отконфигурировал UART принимаю данные, все нормально, при приеме более 256 байт МК вмснет, что я не правильно делаю?Мож есть какой то буфер который надо очищать при приеме?
Принимаю команды в ASCII кодах наподобие AT команд
__________________
То, что нас не убивает - делает нас сильнее
|
|
|
|
03.08.2012, 15:21
|
|
Гражданин KAZUS.RU
Регистрация: 01.01.2007
Адрес: Таганрог
Сообщений: 571
Сказал спасибо: 26
Сказали Спасибо 213 раз(а) в 91 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Код:
|
void USART1_RX_DMA_Init(void)
{
//Включить тактирование DMA1
RCC-›AHBENR |= RCC_AHBENR_DMA1EN;
//Задать адрес источника и приемника и количество данных для обмена
DMA1_Channel5-›CPAR = (uint32_t) &USART1-›DR; //адрес регистра перефирии
// DMA1_Channel5-›CMAR = (uint32_t) &BuffRxd[0]; //адрес буфера в памяти
DMA1_Channel5-›CNDTR = 32; //количество данных для обмена
//----------------- Манипуляции с регистром конфигурации ----------------
//Следующие действия можно обьединить в одну команду (разбито для наглядности)
DMA1_Channel5-›CCR = 0; //предочистка регистра конфигурации
DMA1_Channel5-›CCR &= ~DMA_CCR5_CIRC; //выключить циклический режим
DMA1_Channel5-›CCR &= ~DMA_CCR5_DIR; //направление: чтение из перефирии
//Настроить работу с переферийным устройством
DMA1_Channel5-›CCR &= ~DMA_CCR5_PSIZE; //размерность данных 8 бит
DMA1_Channel5-›CCR &= ~DMA_CCR5_PINC; //неиспользовать инкремент указателя
//Настроить работу с памятью
DMA1_Channel5-›CCR &= ~DMA_CCR5_MSIZE; //размерность данных 8 бит
DMA1_Channel5-›CCR |= DMA_CCR5_MINC; //использовать инкремент указателя
//Уровень приоритета канала
DMA1_Channel5-›CCR &= ~DMA_CCR5_PL; //самый низкий приоритет
//Управление прерываниями канала
// DMA1_Channel5-›CCR |= DMA_CCR5_TEIE; //событие "конец обмена"
// NVIC_EnableIRQ (DMA1_Channel5_IRQn); //разрешить прерывания от выбранного канала
USART1-›CR3 |= USART_CR3_DMAR; //разрешить прием USART1 через DMA
}
void USART1_Init(void)
{
//Включение тактирования
RCC-›APB2ENR |= RCC_APB2ENR_IOPAEN; //Тактирование GPIO
RCC-›APB2ENR |= RCC_APB2ENR_AFIOEN; //Тактирование альтернативных функций GPIO
RCC-›APB2ENR |= RCC_APB2ENR_USART1EN; //Тактирование USART1
//Конфигурирование PORTA.9 для TX; PORTA.10 для RX
GPIOA-›CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9); //Предочистка MODE и CNF
GPIOA-›CRH |= GPIO_CRH_MODE9 | GPIO_CRH_CNF9_1; //Двухтактный выход с альтернативной ф-ей, 50MHz
GPIOA-›CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10); //Предочистка MODE и CNF
GPIOA-›CRH |= GPIO_CRH_CNF10_0; //Вход, третье состояние
//Задание режима работы
// USART1-›BRR = 0x09C4; //Cкорость обмена 9600 бод
USART1-›BRR = 0x00D0; //Cкорость обмена 115200 бод
USART1-›CR1 &= ~USART_CR1_M; //8 бит данных
USART1-›CR2 &= ~USART_CR2_STOP; //Количество стоп-битов: 1
//Управление работой
USART1-›CR1 |= USART_CR1_UE; //Включение модуля USART1
USART1-›CR1 |= USART_CR1_TE; //Включение передатчика
USART1-›CR1 |= USART_CR1_RE; //Включение приемника
//Разрешить прерывания
NVIC_SetPriority(USART1_IRQn , 1);
NVIC_EnableIRQ (USART1_IRQn); //Прерывания USART1
USART1-›CR1 |= USART_CR1_RXNEIE; //Прерывание по завершении приема
} |
__________________
То, что нас не убивает - делает нас сильнее
Последний раз редактировалось serb-radio; 04.08.2012 в 12:22.
|
|
|
|
11.08.2012, 21:41
|
|
Частый гость
Регистрация: 04.06.2011
Сообщений: 15
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Ребят, помогите, пожалуйста. Хочу поставить в качестве SysClk MSI с самой низкой частотой.
Вначале пробовал непосредственно сразу поменять частоту, но мк падал, дебагер ругался.
Затем запустил HSI, перевел тактирование на него. После этого получилось изменить частоту MSI генератора. Однако, когда пытаюсь обратно переключиться на MSI, мк опять падает. Готовности генератора дождался.
Что делаю не так?
|
|
|
|
15.08.2012, 20:26
|
|
Вид на жительство
Регистрация: 02.04.2008
Адрес: Ленинград
Сообщений: 346
Сказал спасибо: 67
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Доброго времени суток!
Подскажите, пожалуйста, к как правильно использовать DMA + UART в режиме чтения?
Когда используешь FIFO все более-менее понятно.
А вот c DMA...
Представим себе ситуацию:
1.) Выделяем под буфер приема положим 64 байта.
2.) Чистим буфер (опционально), т.е. прописываем там 0x0 (64 выделенных байта).
2.) К нам по UART пришла посылка 0x10 0x02 0x00 0x00 0x00 0x00 и благополучно при помощи DMA прописалась в выделенное для нее ОЗУ.
3.) Пусть по таймауту или проверкой битика, взводящегося по по приему байта в UART мы считываем (анализируем ) буфер. Ну с 0x10 и 0x02 все понятно, а вот как быть с нулями? Где конец принятых байтов?
Заранее спасибо.
Последний раз редактировалось Mike121234; 15.08.2012 в 20:33.
|
|
|
|
16.08.2012, 11:34
|
|
Частый гость
Регистрация: 08.05.2011
Сообщений: 25
Сказал спасибо: 12
Сказали Спасибо 7 раз(а) в 4 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
[QUOTE=Mike121234;547673]Доброго времени суток!
Подскажите, пожалуйста, к как правильно использовать DMA + UART в режиме чтения?
Когда используешь FIFO все более-менее понятно.
А вот c DMA...
Представим себе ситуацию:
1.) Выделяем под буфер приема положим 64 байта.
2.) Чистим буфер (опционально), т.е. прописываем там 0x0 (64 выделенных байта).
2.) К нам по UART пришла посылка 0x10 0x02 0x00 0x00 0x00 0x00 и благополучно при помощи DMA прописалась в выделенное для нее ОЗУ.
3.) Пусть по таймауту или проверкой битика, взводящегося по по приему байта в UART мы считываем (анализируем ) буфер. Ну с 0x10 и 0x02 все понятно, а вот как быть с нулями? Где конец принятых байтов?
Все очень просто если в DMA1_Channel5-›CNDTR
// Base 105xx_107x DMA2. 0x4002.0400
// Base 100x4/6/8/B 105xx_107x DMA1. 0x4002.0000
// DMA channel x number of data - DMA_CNDTRx. Reference manual p276.
// DMA_CNDTR5. Offset: 0x005C
// Prepere new start DMA1_Channel5.
// 15:0 - NDT[15:0]: Number of data to transfer.
// Number of data to be transferred (0 up to 65535).
// This register can only be written when the channel is DISABLED!!!!
// Number USART1RX data8 Continues Read from USART1 With help DMA1 Channel5. define in dup0.h.
DMA1_Channel5-›CNDTR = NmbrUSART1RXdata8ContRdWithDMA5;
записали 6, то запрос на прерывание возникнет после 6 принятых байтов.
0x10 0x02 0x00 0x00 0x00 0x00
И не важно какой у вас там размер массива.
|
|
|
|
17.08.2012, 21:01
|
|
Вид на жительство
Регистрация: 02.04.2008
Адрес: Ленинград
Сообщений: 346
Сказал спасибо: 67
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
[QUOTE=Sl_;547783]
Сообщение от Mike121234
|
Доброго времени суток!
Подскажите, пожалуйста, к как правильно использовать DMA + UART в режиме чтения?
Когда используешь FIFO все более-менее понятно.
А вот c DMA...
Представим себе ситуацию:
1.) Выделяем под буфер приема положим 64 байта.
2.) Чистим буфер (опционально), т.е. прописываем там 0x0 (64 выделенных байта).
2.) К нам по UART пришла посылка 0x10 0x02 0x00 0x00 0x00 0x00 и благополучно при помощи DMA прописалась в выделенное для нее ОЗУ.
3.) Пусть по таймауту или проверкой битика, взводящегося по по приему байта в UART мы считываем (анализируем ) буфер. Ну с 0x10 и 0x02 все понятно, а вот как быть с нулями? Где конец принятых байтов?
Все очень просто если в DMA1_Channel5-›CNDTR
// Base 105xx_107x DMA2. 0x4002.0400
// Base 100x4/6/8/B 105xx_107x DMA1. 0x4002.0000
// DMA channel x number of data - DMA_CNDTRx. Reference manual p276.
// DMA_CNDTR5. Offset: 0x005C
// Prepere new start DMA1_Channel5.
// 15:0 - NDT[15:0]: Number of data to transfer.
// Number of data to be transferred (0 up to 65535).
// This register can only be written when the channel is DISABLED!!!!
// Number USART1RX data8 Continues Read from USART1 With help DMA1 Channel5. define in dup0.h.
DMA1_Channel5-›CNDTR = NmbrUSART1RXdata8ContRdWithDMA5;
записали 6, то запрос на прерывание возникнет после 6 принятых байтов.
0x10 0x02 0x00 0x00 0x00 0x00
И не важно какой у вас там размер массива.
|
Спасибо за наводку, но...
1.) Предположим, что посылки которые приходя т на вход могут иметь размер 5, 6, 7, 8 байт.
2.) На вход поступает посылка длительностью 7 байт.
3.) Прерывание DMA срабатывает после 6-го байта, мы считываем начало посылки и ожидаем ее окончания.
4.) И ждать мы будем следующего прерывания DMA до тех пор. пока не придет следующая посылка такой длины, чтобы в сумме с первой она составила больше или равно 12 байт.
5.) Но время не ждет.... Нам-бы конец первой отловить. вторая-то может через год прийти...
Вот если-бы как с Fifo, читаем до тех пор. пока в буфере не 0 байт...
Последний раз редактировалось Mike121234; 17.08.2012 в 21:03.
|
|
|
|
17.08.2012, 22:29
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Mike121234 зачем вам DMA для обработки такого мелкого потока? работает на FIFO - и не трогай.
|
|
|
|
18.08.2012, 14:46
|
|
Частый гость
Регистрация: 08.05.2011
Сообщений: 25
Сказал спасибо: 12
Сказали Спасибо 7 раз(а) в 4 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Mike121234 Откуда Вы знаете длину посылки? Из первого принятого байта?
Вашу задачу я бы решил используя прерывание по каждому принятому байту, те вообще без DMA.
Ну или как компромис минимальнуя длину 4 байта через DMA, затем запретив его через прерывания UARTa - но это уже как-то коряво.
|
|
|
|
20.08.2012, 20:56
|
|
Частый гость
Регистрация: 04.01.2009
Сообщений: 15
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Добрый день!
Никак не могу справиться с выдачей ШИМ на stm32f103v (100 pin). Вот что я делаю:
porta.1 (tim2_ch2) в режим альтернативный выход.
включаю тактирование porta и tim2.
далее загружаю регистры таймера:
в ARR записываю 0xFF (перезагрузка счетчика)
в CCR2 записываю 0x10 (регистр сравнения)
в CCMR1 записываю 0x6000 (т.е. в OC2M будет 6 - режим PWM1)
в CR1 устанавливаю бит CEN - запуск таймера.
На выходе porta.1 - ноль. Что я еще не доделал?
Содержимое регистров контролирую в кейле. Счетчик таймера бежит и перезагружается.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:22.
|
|