Перейти к содержанию

Микроконтроллеры


DeL

Рекомендуемые сообщения

stm32f100rb

Задача состоит в том, чтобы подсоединить к МК датчик температуры и передавать показания с него с помощью радиомодуля(rs232) в эфир.

Как это все организовать в программном коде?

Используем COOCOX. В шитом примере есть разъяснения как сделать ADC+DMA. Вопрос: получается с датчика падает какое-то напряжение на МК, его мы оцифровываем по средству АЦП, потом цифра идет в ДМА память и передается через радомодуль? вот как связать ДМА и радиомодуль и вообще правильный ход мыслей?

Ссылка на комментарий

Думаю, что тебе необходимо настроить UART своего контроллера на передачу данных в радиомодуль, после чего сконфигурировать радиомодуль, если требуется, и передавать данные. Ничего нестандартного в UART-е нет, так что, кури даташиты.

Ссылка на комментарий
  • 2 месяца спустя...

4pok

#include

#include

#include

#include

#include "stm32f10x.h"

int main(void)

{

GPIO_InitTypeDef PORT;

//Включаем порты А и С

RCC_APB2PeriphClockCmd((RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA) , ENABLE);

GPIO_Init( GPIOC , &PORT);

//Порт A настраивать смысла нет, все его ноги по умолчанию входы что нам и нужно

RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC1EN, ENABLE); //Включаем тактирование АЦП

ADC1->CR2 |= ADC_CR2_CAL; //Запуск калибровки АЦП

while (!(ADC1->CR2 & ADC_CR2_CAL))

; //Ожидаем окончания калибровки

ADC1->SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0); //Задаем

// длительность выборки

ADC1->CR2 |= ADC_CR2_JEXTSEL; //Преобразование инжектированной группы

//запустится установкой бита JSWSTART

ADC1->CR2 |= ADC_CR2_JEXTTRIG; //Разрешаем внешний запуск инжектированной группы

ADC1->CR2 |= ADC_CR2_CONT; //Преобразования запускаются одно за другим

ADC1->CR1 |= ADC_CR1_JAUTO; //Разрешить преобразование инжектированной группы

//после регулярной. Не понятно зачем, но без этого не работает

ADC1->JSQR |= (1<<15); //Задаем номер канала (выбран ADC1)

ADC1->CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП

ADC1->CR2 |= ADC_CR2_JSWSTART; //Запуск преобразований

while (!(ADC1->SR & ADC_SR_JEOC)) //ждем пока первое преобразование завершится

;

//Теперь можно читать результат из JDR1

void UART_init(void)

{

// тактируюсь от кварца на 12 МГц

// включаю тактирование ЮАРТ1 и порта на которам он висит

RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

RCC->APB2ENR|= RCC_APB2ENR_AFIOEN;

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

// настраиваю соответсв. порты на вход и выход от расшир. функций

GPIOA->CRH &= ~GPIO_CRH_MODE9;

GPIOA->CRH &= ~GPIO_CRH_CNF9;

GPIOA->CRH &= ~GPIO_CRH_MODE10;

GPIOA->CRH &= ~GPIO_CRH_CNF10;

GPIOA->CRH |= GPIO_CRH_MODE9_1; // выход на 2 МГц

GPIOA->CRH |= GPIO_CRH_CNF9_1;

GPIOA->CRH |= GPIO_CRH_CNF10_0;

// 12 МГц/16*115200 = 6.5

USART1->BRR = (6 << 4) + 8;

// включаю ЮАРТ

USART1->CR1 |= USART_CR1_UE;

USART1->CR1 |= USART_CR1_TE; // включил передатчик

USART1->CR1 |= USART_CR1_RE; // включил приемник

}

// будет передавать данные с АЦП в ЮАРТ по инициативе АЦП, использую 1 канал ПДП

void DMA_init (void)

{

RCC->AHBENR |= RCC_AHBENR_DMA1EN; // подаю такты на DMA1

DMA1_Channel1->CPAR = (uint32_t) &ADC1->DR; // адрес периферии

DMA1_Channel1->CMAR = (uint32_t) &USART1->DR; // адрес памяти

DMA1_Channel1->CNDTR = 1; // количество передач данных, у меня цыклическая передача, счетчик после достижения 0 будет обновляться

// так получилось что значения по умолчанию меня устраивают (т.е. чтение из периферии, 8 бит, без инкримента и т.д.)

DMA1_Channel1->CCR |= DMA_CCR1_CIRC; // цыклическая передача

DMA1_Channel1->CCR |= DMA_CCR1_EN; // включаем

}

void USART1_IRQHandler (void)

{

USART1->DR = USART1->DR; // эхо по приему, флаг прерывание автоматически сбрасывается после чтения

}

}

получатеся у меня такой алгоритм:

1. включаем порты, включаем АDC1, инжектированную группу

2. включаем, настраиваем UART

3. настраиваем DMA,чтоб читал с ADC1

но ничего не работает

Ссылка на комментарий
  • 2 месяца спустя...

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...