Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.
Было то что в принцепе флаги DMA не ныжны можно из без них определить когда передача завершенна будут. Меня это заинтересовало, а так на ум пришли флаги флаги TXE, RXNE (потому что их постоянно использовал) возник вопрос каким образом.
Никак!!! Это говорит о неправильности кода...
Ну это понятно я хотел узнать в какую сторону копать.
rus084 писал(а):при каком входном напряжении порта stm32f4 начинает думать что на нее подали логическую 1 ?
Ни при каком напряжении на его портах МК думать не начнет. Думать обязан программист. А ответ на этот вопрос лежит в КАЖДОМ PDF на КАЖДЫЙ МК. Достаточно открыть и прочитать. Заодно немного отвлечься и осознать, а что же это такое - "логическая 1"? Нечто непокобелимое или шаткое и безразмерное?
тогда проще сделать так:
брать минимальное значение ацп за прошлый период , если текущее значение ацп меньше минимального прошлого значения ацп + х% , генерировать прерывание .
но как это сделать?
ведь контроллер вычисляет еще много чего
Всем привет!
Пишу тут одну программулину.
Понадобилось мне обработать критическую секцию, где нужно отрубить все прерывания.
Пораскинув чем смог пришел к выводу что если есть __enable_irq (); (глобальное разрешение прерывания), то есть и __disable_irq ();. Так вот вопрос, а насколько __disable_irq (); глобально? т.е. если ли прерывания, на которые __disable_irq (); не влияет?
Rimsky, даже как-то не верится - apbclock для расчета битрейта берется из текста и автоматически все делители учитываются..
Единственное объяснение - в тексте стоит кварц на 8, а физически стоит 4.
PRx: Pending bit on line x (x = 17 to 0)
0: No trigger request occurred
1: selected trigger request occurred
This bit is set when the selected edge event arrives on the external interrupt line. This bit is cleared by writing a 1 to the bit.
Почитайте что такое rc_w1 ...
read/clear (rc_w1) Software can read as well as clear this bit by writing 1. Writing ‘0’ has no effect
on the bit value.
"Я не даю готовых решений, я заставляю думать!"(С)
Здравствуйте, уважаемые коты:)
Начал ковыряться с SPI в STM32, пытаюсь отправить байтик от SPI2 (master) к SPI1 (slave). Вылез ворох всяких проблем
Вот код (надерган из интернета и местами дополнен моими "светлыми мыслями") :
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_spi.h"
#include "pereph.h"
#include <stdio.h>
volatile u32 time = 0;
int main(void)
{
SystemInit();
SPI_init();
__enable_irq(); //Глобальное включение прерывания
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //Подаем сигнал CS слейву
SPI2->DR = 0x30;
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) //Передатчик занят?
; // значит ничего не делаем
GPIO_SetBits(GPIOB,GPIO_Pin_12); //Снимаем сигнал CS
GPIO_SetBits(GPIOC, GPIO_Pin_8);
for (time = 100000; time > 0; time--)
{
;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
for (time = 100000; time > 0; time--)
{
;
}
}
}
//Обработчик прерываний от SPI2
void SPI2_IRQHandler (void)
{
if (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==SET)
{
// Прерывание вызвано приемом байта ?
uint8_t SPI_master_resive_data = SPI2->DR; //Читаем то что пришло
SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_RXNE);
}
}
//Обработчик прерываний от SPI1
void SPI1_IRQHandler (void)
{
if (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==SET)
{
// Прерывание вызвано приемом байта ?
uint8_t data = SPI1->DR; //Читаем то что пришло
SPI1->DR = data + 1; //И отправляем обратно то что приняли
SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_RXNE);
}
}
Ну и собственно проблемы:
1) SPI2 шлет байтики исправно (хотя тут тоже непонятно: смотрю осциллографом - вижу что-то похожее на свои 0x30, а в регистре данных 0x0...0FF), но если я разрешаю прерывание по получению байта в SPI2, то сразу после отправления байта попадаю в обработчик прерываний по умолчанию. Пробовал закомментировать инициализацию ног SPI, особо не повлияло
2) SPI1 как-то не хочет эти байтики видеть и в регистре данных исправно пишет нули. Но если ткнуть осциллографом в лапу NSS, данные я получаю один раз и тут же отправляюсь в обработчик прерываний по умолчанию.
Ткните меня носом в мои косяки, если кто увидит:) Камень большой и для меня новый, так что не знаю многих вещей
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Проблему с паршивым приемом по SPI1 я решил. На SPI2 (master) был неправильно инициализирован вывод NSS. У меня IF, a нужно Out_PP.
Осталась только проблема с тем, что я висну при разрешении прерывания по приему от SPI1 или SPI2. Может вектор прерывания я не до конца описал? Или он расположен у меня не там?
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
с обработчиком прерывания по умолчанию проблему решил. похоже, кроме того, что прерывание разрешил, нужно еще и настраивать его приоритеты. иначе не катит по крайней мере у меня.
добавил такие строчкиСпойлер