STM32 новичку в ARM что к чему
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Чтобы переопределить его.
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: STM32 новичку в ARM что к чему
menzoda писал(а):Так что еще раз: зачем библиотеки времени исполнения указатель на стек, если он и так уже правильно инициализирован и всем известен?
Ну вот захочешь ты сделать многопоточное приложение. У каждого потока должен быть свой стек. Врядли есть другое разумное применение.
Re: STM32 новичку в ARM что к чему
Всем доброго времени суток! Запустил ДМА на стм32, но почемуто отправляется ровно на 2 байта меньше чем я задаю. Вот код
собственно я использую дма для отправки буфера в RS485. когда данные готовы, запускаю функцию StartDMAChannel4 и передаю ей кол-во байт которые нужно передать, и всегда передается на 2 байта меньше чем я указываю.. я конечно могу просто прибавить 2 к кол-ву, но хочется разобраться))
Код: Выделить всё
void USART1_TX_DMA_Init(void)
{
if ((RCC->AHBENR & RCC_AHBENR_DMA1EN) != RCC_AHBENR_DMA1EN)
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
DMA1_Channel4->CPAR = (uint32_t) &USART1->DR;
DMA1_Channel4->CMAR = (uint32_t) &transmit_buffer[0];
DMA1_Channel4->CNDTR = 16;
DMA1_Channel4->CCR = 0;
DMA1_Channel4->CCR &= ~DMA_CCR4_CIRC;
DMA1_Channel4->CCR |= DMA_CCR4_DIR;
DMA1_Channel4->CCR &= ~DMA_CCR4_PSIZE;
DMA1_Channel4->CCR &= ~DMA_CCR4_PINC;
DMA1_Channel4->CCR &= ~DMA_CCR4_MSIZE;
DMA1_Channel4->CCR |= DMA_CCR4_MINC;
DMA1_Channel4->CCR &= ~DMA_CCR4_PL;
DMA1_Channel4->CCR |= DMA_CCR4_TEIE;
DMA1_Channel4->CCR |= DMA_CCR4_TCIE;
NVIC_EnableIRQ (DMA1_Channel4_IRQn);
USART1->CR3 |= USART_CR3_DMAT;
}
void StartDMAChannel4(unsigned int LengthBufer)
{
DMA1_Channel4->CCR &= ~DMA_CCR4_EN;
DMA1_Channel4->CNDTR = LengthBufer;
DMA1->IFCR |= DMA_IFCR_CTCIF4;
DMA1_Channel4->CCR |= DMA_CCR4_EN;
}
void DMA1_Channel4_IRQHandler(void)
{
if(DMA1->ISR & DMA_ISR_TCIF4) {
RS485->BRR = RS485_RXTX;
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
DMA1->IFCR |= DMA_IFCR_CGIF4; //очистка флагов
}собственно я использую дма для отправки буфера в RS485. когда данные готовы, запускаю функцию StartDMAChannel4 и передаю ей кол-во байт которые нужно передать, и всегда передается на 2 байта меньше чем я указываю.. я конечно могу просто прибавить 2 к кол-ву, но хочется разобраться))
Re: STM32 новичку в ARM что к чему
Леонид Иванович писал(а):Чтобы переопределить его.
В смысле переопределить? По идее я его могу задать каким мне нужно и без этой функции (кстати надо проверить), а задавать его одним и потом в этом же стартап-файле переопределять другим - ерунда получается.
balmer писал(а):Ну вот захочешь ты сделать многопоточное приложение. У каждого потока должен быть свой стек. Вряд ли есть другое разумное применение.
В том то и дело, что функция всего одна! Она возвращает всегда одни и те же жестко заданные значения. Скорей всего вызывается один раз при инициализации библиотеки (тоже надо проверить). Несколько разных указателей стека через нее не передашь.
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: STM32 новичку в ARM что к чему
menzoda писал(а): В том то и дело, что функция всего одна! Она возвращает всегда одни и те же жестко заданные значения.
Эк, глянул. Нигде эта функция не вызывается в стандартных примерах. Действительно возвращает одни и те-же значения. Причем не те, что заданы в файле STM32_FLASH.ld от сэмплика стандартного. Что-то устаревшее/ненужное.
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
menzoda писал(а):В смысле переопределить?
Функция __user_setup_stackheap() нужна лишь для того, чтобы пользователь мог ее переопределить и получить другой способ задания кучи и стека, например, с помощью scatter-файла.
Re: STM32 новичку в ARM что к чему
Народ, помогите пожалуйста, кто работал с ДМА
Проблему предыдущего моего сообщения я решил. Оказывается прерывание по от ДМА срабатывает не тогда когда последний байт передан, а тогда когда он положен в регистр юарта, поэтому я слишком рано переключался на прием RS485, и не все байты отправлялись в шину. Но вот засада, теперь тот же код для 7-го канала дма и 2 юарта не работает также как предыдущий код для юарт 1. Вернулся в тот проект где используется 4-й канал и 1-й юарт - обнаружил следующую особенность, прерывание от ДМА не срабатывает если в инициализации не включить прерывание при ошибке передачи а включить только при завершении передачи данных . Но если включаю прерывания при ошибке передачи, то при возникновении прерывания ДМА всегда срабатывает именно событие конец обмена . Какая тут связь я что-то не понимаю.
вот обработчик прерывания
Код: Выделить всё
DMA1_Channel4->CCR |= DMA_CCR4_TÑIE; //событие ошибка обменаКод: Выделить всё
DMA1_Channel4->CCR |= DMA_CCR4_TEIE; //событие конец обменаКод: Выделить всё
DMA1_Channel4->CCR |= DMA_CCR4_TEIE; //событие конец обменавот обработчик прерывания
Код: Выделить всё
//передача завершена
void DMA1_Channel4_IRQHandler(void)
{
//событие конец обмена
if(DMA1->ISR & DMA_ISR_TCIF4) {
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
}
DMA1->IFCR |= DMA_IFCR_CGIF4; //очистка флагов
}Re: STM32 новичку в ARM что к чему
Сори, я перепутал флаги местами. все работает как надо.
- rus084
- Друг Кота
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
- Контактная информация:
Re: STM32 новичку в ARM что к чему
если порт stm32f4 перевести в режим входа с подтяжкой к питанию , какого номинала резистор подтяжки там используется?
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Интересно, а почему Вы это спрашиваете на форуме, а не читаете в datasheet? А там написано, что типовое 11 кОм для PA10, PB12 и 40 кОм для остальных.
Re: STM32 новичку в ARM что к чему
Подскажите, решил разобраться с STM32 приобрел плату такую с STM32F103VET6.
В начале была установлена базовая прошивка - мигание 2 диодами, она работала.
Начал по этой инструкции: http://radiokot.ru/articles/56/
На моей плате диоды подписаны как PE5 и PE6, соответственно написал такую программку, задумка была чтоб они зажглись и горели:
успешно залил через flash loader, вернул boot0 на место, запустил, но диоды не замигали.
Пробовал разные примеры и комбинации но так ни разу мигнуть диодом не получилось, подскажите, в чем проблема?
В начале была установлена базовая прошивка - мигание 2 диодами, она работала.
Начал по этой инструкции: http://radiokot.ru/articles/56/
На моей плате диоды подписаны как PE5 и PE6, соответственно написал такую программку, задумка была чтоб они зажглись и горели:
Код: Выделить всё
#include <stm32f10x.h>
#include <stm32f10x_conf.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitTypeDef gpio;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &gpio);
GPIO_SetBits(GPIOE, GPIO_Pin_5|GPIO_Pin_6);
do __NOP(); while (1);
}успешно залил через flash loader, вернул boot0 на место, запустил, но диоды не замигали.
Пробовал разные примеры и комбинации но так ни разу мигнуть диодом не получилось, подскажите, в чем проблема?
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: STM32 новичку в ARM что к чему
1. Светодиоды как подключены? Обычно подключают анодом к питанию, а катодом к порту МК - в таком случае включать нужно подачей "0" на порт: GPIO_ResetBits(GPIOE, GPIO_Pin_5|GPIO_Pin_6);
2. Вы в проекте все файлики включили, я имею ввиду startup?
2. Вы в проекте все файлики включили, я имею ввиду startup?
Все будет только лучше, в крайнем случае - хуже.
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 новичку в ARM что к чему
А мне честно говоря этот момент не ясен
У Вас светодиоды горят или нет?
и тут жеanber писал(а):задумка была чтоб они зажглись и горели:
anber писал(а):запустил, но диоды не замигали.
У Вас светодиоды горят или нет?
Re: STM32 новичку в ARM что к чему
coredumped писал(а):1. Светодиоды как подключены? Обычно подключают анодом к питанию, а катодом к порту МК - в таком случае включать нужно подачей "0" на порт: GPIO_ResetBits(GPIOE, GPIO_Pin_5|GPIO_Pin_6);
Спасибо, заработало, теперь отправная точка есть
Re: STM32 новичку в ARM что к чему
Здравствуйте, начал разбираться с DMA. Надо отправить/принять по SPI некий массив.
С отправкой как бы более менее понятно забиваем откуда куда отправлять и всё.
А вот с приёмом совсем туго. Там же что бы принять надо сначала отправить
и как это сделать ?
А что происходит с CS он сам дрыгается после отправки каждого байта ? или вообще не как ?
Мне надо его переключать в начале и в конце приёма массива.
DMA_FLAG_FEIF4 флаг в состоянии set получаю. (Streamx FIFO error flag) чего я не правильно сделал?
С отправкой как бы более менее понятно забиваем откуда куда отправлять и всё.
А вот с приёмом совсем туго. Там же что бы принять надо сначала отправить
и как это сделать ?А что происходит с CS он сам дрыгается после отправки каждого байта ? или вообще не как ?
Мне надо его переключать в начале и в конце приёма массива.
Код: Выделить всё
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
DMA_DeInit(DMA_Channel_0);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)text;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_Init(DMA1_Stream4, &DMA_InitStructure);
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
DMA_ITConfig(DMA_Channel_0, DMA_IT_TC, ENABLE);
NVIC_EnableIRQ(DMA1_Stream4_IRQn);
Код: Выделить всё
void DMA1_Stream4_IRQHandler(void)
{
TEST12[0]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TCIF4);
TEST12[1]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_HTIF4);
TEST12[2]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TEIF4);
TEST12[3]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_DMEIF4);
TEST12[4]=DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_FEIF4); // Streamx FIFO error flag
}
DMA_FLAG_FEIF4 флаг в состоянии set получаю. (Streamx FIFO error flag) чего я не правильно сделал?
Re: STM32 новичку в ARM что к чему
С вопросом почему не работает разобрался. Флаг прерывания криво разрешал
Решил померить как быстро(в тактах) предается массив по SPI
нашёл где-то дефайны
Функция Send отправляет 2-3 раза по 8кб file_len=22кб maxlen=8кб
И теперь смотрю что запишется в dwt_timestamp[9]
ставлю точку остановки на content += send_len;
первый запуск 12 824 234 вторая итерация цикла 136 408 третья 106 806
Как так ??????????? одна и также функция выполняет передачу одинакового количества байтов.
Если поставить ещё одну точку остановки на DWT_CYCCNT = 0; и потом пошагово дойти до второй точке, то никаких 12 824 234 тактов нету.
Как правильно измерить за сколько тактов выполняется функция send(s, content, send_len); ?????
Код: Выделить всё
DMA_ITConfig([b]DMA_Channel_0[/b], DMA_IT_TC, ENABLE);Решил померить как быстро(в тактах) предается массив по SPI
нашёл где-то дефайны
Код: Выделить всё
// DWT (Data Watchpoint Trigger) - high-resolution counter for precise timing ----------
#define DWT_CYCCNT *(volatile uint32_t *)0xE0001004 //counter of CPU ticks; at 168MHz, it overflows in 25.6 seconds
#define DWT_CONTROL *(volatile uint32_t *)0xE0001000 //the LS bit is CYCCNTENA - enabler of DWT_CYCCNT
#define SCB_DEMCR *(volatile uint32_t *)0xE000EDFC //Debug Exception and Monitor Control Register;
//DWT initialization:
SCB_DEMCR |= 0x01000000;
//DWT_CYCCNT = 0; //if need to start from zero
DWT_CONTROL |= 1; // enable the counter
Функция Send отправляет 2-3 раза по 8кб file_len=22кб maxlen=8кб
И теперь смотрю что запишется в dwt_timestamp[9]
ставлю точку остановки на content += send_len;
первый запуск 12 824 234 вторая итерация цикла 136 408 третья 106 806
Как так ??????????? одна и также функция выполняет передачу одинакового количества байтов.
Если поставить ещё одну точку остановки на DWT_CYCCNT = 0; и потом пошагово дойти до второй точке, то никаких 12 824 234 тактов нету.
Код: Выделить всё
while (file_len)
{
if (file_len >= maxlen){
send_len =maxlen;
}
else{send_len = file_len;}
DWT_CYCCNT = 0;
send(s, content, send_len);
dwt_timestamp[9] = DWT_CYCCNT;
content += send_len;
file_len -= send_len;
counter_test++;
}
Как правильно измерить за сколько тактов выполняется функция send(s, content, send_len); ?????
Re: STM32 новичку в ARM что к чему
С предыдущим постом разобрался всё дело было в функции send при первом запуске она зависала на 12 млн.
Начал дальше с DMA разбиратся сделал функцию чтения.
dmaSEND_TX и dmaRESIVE одинаковы. Прерывания от DMA выключены.
Это всё работало , пока не запустил SysTick . В обработчике прерываний нечего нету просто инкремент одной переменной.
После этого через пару вызовов функций WIZCHIP_READ_DMA она зависает на приёмнике
Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.Но как прерывание то может влияет на опрос флага ?
Что происходит с флагами SPI(Приём/передача) после инициализации DMA Они постоянно дёргаются или после того как весь массив передастся они выставятся ? Это вопрос к тому можно ли SPI флага сделать подобную задержку.
Начал дальше с DMA разбиратся сделал функцию чтения.
Код: Выделить всё
uint8_t WIZCHIP_READ_DMA(uint32_t AddrSel){
unsigned char buff[4];
unsigned char read[4];
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
//---------- масив---------------------------------------
AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_FDM_OP_LEN1_);
buff[0]=((AddrSel & 0x00FF0000) >> 16);
buff[1]=((AddrSel & 0x0000FF00) >> 8);
buff[2]=((AddrSel & 0x000000FF) >> 0);
buff[3]=0xFF;
//----------
dmaSEND_TX(DMA1_Stream4,buff,4); // отправляем собранный массив
dmaRESIVE(DMA1_Stream3,read,4);
while(DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TCIF4)!=SET){};
while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};
DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4);
DMA_ClearFlag(DMA1_Stream3,DMA_FLAG_TCIF3);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
return read[3];
}dmaSEND_TX и dmaRESIVE одинаковы. Прерывания от DMA выключены.
Код: Выделить всё
void dmaSEND_TX(DMA_Stream_TypeDef* DMAy_Streamx,unsigned char * buf,unsigned int len){
DMAy_Streamx->CR &= ~(uint32_t)DMA_SxCR_EN;// Запрет DMA
DMAy_Streamx->PAR= (uint32_t)(&SPI2->DR);
DMAy_Streamx->NDTR = len;
DMAy_Streamx->M0AR = (uint32_t)buf;
DMAy_Streamx->CR |= (uint32_t)DMA_SxCR_EN; // STArt DMA
}
Это всё работало , пока не запустил SysTick . В обработчике прерываний нечего нету просто инкремент одной переменной.
После этого через пару вызовов функций WIZCHIP_READ_DMA она зависает на приёмнике
Код: Выделить всё
while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.Но как прерывание то может влияет на опрос флага ?
Что происходит с флагами SPI(Приём/передача) после инициализации DMA Они постоянно дёргаются или после того как весь массив передастся они выставятся ? Это вопрос к тому можно ли SPI флага сделать подобную задержку.
Код: Выделить всё
while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};Re: STM32 новичку в ARM что к чему
pokk писал(а):Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.
Как только началась передача очередных данных периферией...
Но как прерывание то может влияет на опрос флага ?
Никак!!! Это говорит о неправильности кода...
Что происходит с флагами SPI(Приём/передача) после инициализации DMA Они постоянно дёргаются или после того как весь массив
А что говорит даташит??? Вы что... без чтения даташита и без ЛА работаете... наобум??? Флаг BSY для чего существует???
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32 новичку в ARM что к чему
Похоже на метод перебора... "Так не получается, а если мы вот так?.."HHIMERA писал(а):А что говорит даташит??? Вы что... без чтения даташита и без ЛА работаете... наобум??? Флаг BSY для чего существует???
С уважением,
Виктор.
Виктор.
