Ждем пока установится бит RCC_BDCR_LSERDY в RCC->BDCR.СКАЗОЧНИК писал(а):while ((RCC->BDCR & RCC_BDCR_LSERDY) != RCC_BDCR_LSERDY)
Но это лучше делать с таймаутом. Если не будет "часового" кварца или они неисправен, программа повиснет в этом цикле.
Ждем пока установится бит RCC_BDCR_LSERDY в RCC->BDCR.СКАЗОЧНИК писал(а):while ((RCC->BDCR & RCC_BDCR_LSERDY) != RCC_BDCR_LSERDY)
Код: Выделить всё
#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000UL)
#define RCC_BASE (AHBPERIPH_BASE + 0x00001000UL)
#define RCC ((RCC_TypeDef *)RCC_BASE)Код: Выделить всё
typedef struct
{
__IO uint32_t CR;
__IO uint32_t CFGR;
__IO uint32_t CIR;
__IO uint32_t APB2RSTR;
__IO uint32_t APB1RSTR;
__IO uint32_t AHBENR;
__IO uint32_t APB2ENR;
__IO uint32_t APB1ENR;
__IO uint32_t BDCR;
__IO uint32_t CSR;
} RCC_TypeDef;Код: Выделить всё
while ((RCC->BDCR & RCC_BDCR_LSERDY) != RCC_BDCR_LSERDY)Код: Выделить всё
while ((RCC->BDCR & 0x02) != 0x02)Может HSE, но не LSE. Ему порой и 6 секунд мало.СКАЗОЧНИК писал(а):Стабилизируется кварц, вроде как за 6 тактов своих.
имхо, проблема надуманная. программист должен не тупо следовать стандарту Си, а следовать логике работы программы. функция HAL_SPI_Receive_DMA занимается исключительно тем, что запускает аппаратуру на работу с памятью. аппаратуре же чихать с высокой колокольни на квалификатор адреса или на то, как описана память по этому адресу, ей важно численное значение этого адреса. что и делается при помощи uint8_t *pData. чтобы не было никаких варнингов, тут следовало бы использовать void*, что даже больше соответствует всей логике работы, как аппаратуры (требующей абстрактный адрес), так и программы (которой все равно, что за буфер).a5021 писал(а):Итого имеем: передача правильного буфера вызывает возражения компиля, в то время, как передача горбухи проходит на ура.
Нет. Структура - это переменная, которая группирует внутри себя другие переменные (поля). Эти переменные в памяти располагаются последовательно, возможно, выравниваясь при этом определённым образом (читать про упаковку структур). В случае регистров упаковка простая - там шаг равен 4 байтам (размерности указателя на STM32)СКАЗОЧНИК писал(а):Как я понимаю, то структура это некоторый последовательный набор адресов под одним именем
Нет, чтобы обратиться к конкретному полю ("вложенной" переменной), используется оператор "." (точка). А оператор "->" используется потому, что RCC - это не структура, а указатель на структуру - а для указателей используется именно такой "синтаксический сахар". Но можно было бы и через точку, разыменовав этот указатель: (*RCC).BDCR - но это не так "красиво" выглядит.СКАЗОЧНИК писал(а):Чтобы обратиться конкретно к нужному адресу используется оператор ->
Да, это типичный синтаксис в C для проверки того, установлен ли бит или нет. Скажем, проверить, что в переменной "x" бит 3 (0x04) установлен или сброшен, можно так:СКАЗОЧНИК писал(а):Вытаскиваем из него только нужный бит и делаем с ним != 0х02
Код: Выделить всё
if (x & 0x04 == 0x04) // проверка на бит=1
if (x & 0x04 != 0x04) // проверка на бит=0Тут соглашусь. Первоначальная инициализация LSE может быть очень долгой (особенно если нет батарейного питания). Поэтому лучше в таком цикле проверки не висеть, а сделать что-то вроде конечного автомата для инициализации LSE, входя в инициализирующую функцию в основном цикле, например, раз в секунду, проверяя его состояние. То есть, инициализировать как бы "в фоне", делая / инициализируя параллельно более важные вещи.Мурик писал(а):Может HSE, но не LSE. Ему порой и 6 секунд мало.
имхо, проблема надуманная. программист должен не тупо следовать стандарту Си, а следовать логике работы программы.[/uquote]a5021 писал(а):Итого имеем: передача правильного буфера вызывает возражения компиля, в то время, как передача горбухи проходит на ура.
Чем хочет пусть занимается. Она должна молча принять правильные параметры и взматериться на неправильные. Странно, но вы уже второй, кому захотелось подоказывать, что правильно будет наоборот. Осень?функция HAL_SPI_Receive_DMA занимается исключительно тем,
с моей т.з. правильно будет void*. или volatile void* по-вашему правильнее? именно абстрактный адрес без указания того, что память там может меняться - void*.a5021 писал(а):что правильно будет наоборот
не надо агрессии и хамства.a5021 писал(а):Осень?
глупости - используют те, кому собственное время дорого, а ресурсы МК дешевы.Eddy_Em писал(а):printf на МК только абдуринщики используют
printf отлично используется для вывода в USART, для чего, собственно, он изначально и предназначался - вывод в последовательный поток.СКАЗОЧНИК писал(а): А в МК не всегда есть экран
расскажите нам, как контроллер DMA изменит своё поведение от того, что получит указатель с volatile или без оного.a5021 писал(а):Другое дело volatile
То есть, Вы специально зачем-то передаёте в функцию volatile буфер (хотя она принимает обычный указатель), и считаете это правильным? Ну, приведите явно к обычному указателю при вызове, и будет вам счастье без варнингов.a5021 писал(а):Все ровно так, как вы любите. Но если захочется погорячее и придет в голову сделать все-таки правильно, то жгучий перчик не замедлит обнаружиться:
Итого имеем: передача правильного буфера вызывает возражения компиля, в то время, как передача горбухи проходит на ура
Пока что я испытываю крайнее разочарование от столь бестолковых советов.Ну, приведите явно к обычному указателю при вызове, и будет вам счастье без варнингов.
У вас растет бузина в огороде?a5021 писал(а):Вы про бузину в огороде?
И я про тоже что volatile в данном случае не нужен.WiseLord писал(а):То есть, Вы специально зачем-то передаёте в функцию volatile буфер (хотя она принимает обычный указатель), и считаете это правильным?
Хотите сказать что приведя тип исключив volatile, функция работает не так как должна?a5021 писал(а):Конечная запись этого адреса в регистр будет все равно, как 32-бита без знака. Другое дело volatile.
Вы изменяете содержимое буфера после его передачи функции и до завершения DMA транзации?a5021 писал(а):То, что изменяемые извне переменные должны объявляться с модификатором volatile
Не хотите тут получать советы - обращайтесь в техподдержку ST и требуйте чтобы у функции был модификатор volatile, аргументировано объясняя им зачем он нужен в данном случае.a5021 писал(а):ока что я испытываю крайнее разочарование от столь бестолковых советов.