Страница 1 из 4

STM32 Первый старт

Добавлено: Пн авг 08, 2011 21:37:18
inkHunter
Настроил таймер и порт с помощью STM32_Init.c все норм но почему то если добавляю библиотеку stm32f10x чтобы можна работать с GPIOC->BSRR=GPIO_BSRR_BS8 выдает ошибку или как по другому управлять портом ?! ((( В самом дебаге прерывание работает, помогите пожалуйста
#include <stm32f10x_lib.h>
#include "STM32_Init.h"
int a=0;
void TIM1_UP_IRQHandler (void)
{
if ((TIM1->SR & 0x0001) != 0)
{
if (a==0)
{
// GPIOC->BSRR=GPIO_BSRR_BS8; // on ошибка
a=1;
}
else
{
// GPIOC->BSRR=GPIO_BSRR_BR8; // off ошибка
a=0;
}

TIM1->SR &= ~(1<<0);
}
}

int main (void)
{
stm32_Init ();
while (1)
{
}
}
STM32_Timer.rar
исходник
(230.73 КБ) 499 скачиваний

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 05:34:49
BerZerK-ku
Почему :#include <stm32f10x_lib.h> , а не #include <stm32f10x.h> ?

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 09:35:46
inkHunter
BerZerK-ku писал(а):Почему :#include <stm32f10x_lib.h> , а не #include <stm32f10x.h> ?
убрал #include <stm32f10x_lib.h> подключил #include <stm32f10x.h> все норм... в программе все работает прерывание, порт, но когда загружаю на дискавери выдает error while attempting to read 312 bytes from 0x10000000 нажимаю ок, отлажую, но виснет после stm32_Init (); ((((

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 16:21:21
Galizin
Если в программе все работает, то что же не так? После инициализации стоит глухой while(1) - он и должен зависать.

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 18:00:51
inkHunter
Galizin писал(а):Если в программе все работает, то что же не так? После инициализации стоит глухой while(1) - он и должен зависать.
Виснет у stm32_Init (); не доходит до while(1)

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 20:04:39
dosikus
Victor Gordienko писал(а):
Galizin писал(а):Если в программе все работает, то что же не так? После инициализации стоит глухой while(1) - он и должен зависать.
Виснет у stm32_Init (); не доходит до while(1)
Тактовая (множитель) верно настроена ?

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 21:45:52
inkHunter
dosikus писал(а):
Victor Gordienko писал(а): Виснет у stm32_Init (); не доходит до while(1)
Тактовая (множитель) верно настроена ?
не уверен, только начал разбираться с стм32, если есть время скачайте исходник пожалуйста и посмотрите. Спасибо

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 22:11:13
dosikus
Множитель стоял 9 , выставь как на картинке.
8*9=72 однако :)))
а 100RB только 24 могет...

Изображение

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 22:30:52
inkHunter
Множитель стоял 9 , выставь как на картинке.
8*9=72 однако :)))
а 100RB только 24 могет...


Все, большое Вам спасибо, работает. Нет ли у Вас примеров как у STM32_Init.c настроить АПЦ или ШИМ? Хочеться поработать с STM32.

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 22:36:52
dosikus
http://ziblog.ru/category/mikrokontrolleryi/stm32/

Этот INIT всего лишь файл конфигурации к тому же старый и неполный .
Лучше понять все , чем шаблонами пользоваться .
Смотри ссылку...

Re: STM32 TIM1+Прерывание

Добавлено: Вт авг 09, 2011 22:49:46
inkHunter
dosikus писал(а):http://ziblog.ru/category/mikrokontrolleryi/stm32/

Этот INIT всего лишь файл конфигурации к тому же старый и неполный .
Лучше понять все , чем шаблонами пользоваться .
Смотри ссылку...
Как все сложно, с авр все просто, будем разбираться ....

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 00:06:41
SubDia
Интересно, кстати, замечено.. Я все глаза высмотрел - не увидел. Вот что опыт животворящий делает, однако! =)
dosikus, спасибо за ссылку. Мне что-то все старые материалы попадались (которые, гм, не без ошибок).
(Вы, кстати, не модератор на одном из подобных сайтов, аль обознался я?)
Victor Gordienko, оно сложно конечно, сходу не получится, наверное. Но вот АЦП достаточно просто запустить (без заковыристых режимов) - я как раз добился нормальной работы оного. Только над документацией сидеть долго придется, я уже забыл как пахнет разогретый паяльник. Все бумажки да бумажки. Чувствую, после этого зверя об АВР-ах позабуду напрочь. :beer:

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 00:21:58
inkHunter
SubDia писал(а):Интересно, кстати, замечено.. Я все глаза высмотрел - не увидел. Вот что опыт животворящий делает, однако! =)
dosikus, спасибо за ссылку. Мне что-то все старые материалы попадались (которые, гм, не без ошибок).
(Вы, кстати, не модератор на одном из подобных сайтов, аль обознался я?)
Victor Gordienko, оно сложно конечно, сходу не получится, наверное. Но вот АЦП достаточно просто запустить (без заковыристых режимов) - я как раз добился нормальной работы оного. Только над документацией сидеть долго придется, я уже забыл как пахнет разогретый паяльник. Все бумажки да бумажки. Чувствую, после этого зверя об АВР-ах позабуду напрочь. :beer:
Можете скинуть исходник АЦП ?

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 01:01:19
SubDia
Скинуть исходник могу, конечно. Да только работаю я в IAR, во-первых; во-вторых - кроме АЦП, у меня там еще UART, кнопка, и прерывания по UART и EXTI. Много мешанины, Вам ненужной, хотя комментарии писал к каждой строке практически.
Могу вычленить инициализацию АЦП (и дальнейший его запуск), и в виде кода оформить в сообщении. Если будет угодно.

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 04:22:21
inkHunter
SubDia писал(а):Скинуть исходник могу, конечно. Да только работаю я в IAR, во-первых; во-вторых - кроме АЦП, у меня там еще UART, кнопка, и прерывания по UART и EXTI. Много мешанины, Вам ненужной, хотя комментарии писал к каждой строке практически.
Могу вычленить инициализацию АЦП (и дальнейший его запуск), и в виде кода оформить в сообщении. Если будет угодно.
ок, спасибо )

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 09:37:57
SubDia
Так скидывать код или нет? :)

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 10:59:26
inkHunter
SubDia писал(а):Так скидывать код или нет? :)
да

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 12:39:35
SubDia
Инициализация:

Код: Выделить всё

  RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;  //Подключаем АЦП к линии тактирования
  RCC->CFGR |= RCC_CFGR_ADCPRE;        //Предделитель на максимум (на 8)
  RCC->CFGR |= RCC_CFGR_ADCPRE_DIV8;

  ADC1->CR2 |= ADC_CR2_CAL;          //Запуск калибровки (это нужно сделать ДО установки ADON)
    while (!(ADC1->CR2 & ADC_CR2_CAL))
    {
    }
  ADC1->SQR3 |= (ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3); //выбираем 10й канал (PC0)
  ADC1->CR2 |= (ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTTRIG);
  ADC1->CR2 |= ADC_CR2_ADON;
  GPIOC->CRL &= ~GPIO_CRL_CNF0;                        //Аналоговый вход (это АЦП, 10й канал)
  GPIOC->CRL &= ~GPIO_CRL_MODE0;
Собственно запуск:

Код: Выделить всё

void ADC_RBat(void)                   
{   
    ADC1->CR2 |= ADC_CR2_SWSTART;     //Запуск преобразования
    while (!(ADC1->SR & ADC_SR_EOC))  //Ждем окончания преобразования
    { 
    }
    adc = ADC1->DR;                   //Считываем данные
    adcLSB = adc;                     //Выделяем младшую часть
    adc>>=8;                          //Сдвигаем
    adcMSB = adc;                     //И выделяем старшую часть
 return;
}
В функции запуска и обработки результатов измерения мне потребовалось разбить результат на старшую и младшую части - чтобы потом передать по UART. Вам это может не потребоваться. Также обратите внимание на коэффициент деления тактовой частоты при инициализации. Я установил максимальный коэффициент (8), так как использую внешний кварц.
А все остальное - посмотрите по описанию регистров АЦП, все прояснится.

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 13:05:13
inkHunter
Большое спасибо ) Вроде все понял кроме того как выбрать канал АЦП
ADC1->SQR3 |= (ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3); не могли бы Вы объяснить эту строчку, или как выбрать другой канал ?

Re: STM32 TIM1+Прерывание

Добавлено: Ср авг 10, 2011 13:59:40
SubDia
Да, конечно, поясню.
В общем, мы имеем возможность производить до 16 измерений последовательно - от 0 до 15 (считайте, что это общее количество каналов). В регистрах SQR1..SQR3 у нас находятся "ячейки" всех 16 преобразований. Область первого преобразования находится в регистре SQR3 (SQ1). А чтобы выбрать канал № 10, нужно в эту "ячейку" записать число 1010 = 10. То есть строкой

Код: Выделить всё

ADC1->SQR3 |= (ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3);
я устанавливаю первый и третий биты в этой "ячейке", получая таким образом число 1010 (в двоичном виде), либо 10 - в десятичном виде. Это номер канала.
Если Вы захотите выбрать, к примеру, канал № 6, тогда Вам нужно будет эту строку видоизменить следующим образом:

Код: Выделить всё

ADC1->SQR3 |= (ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_2);
, записывая туда число 0110 = 6.
Учитывайте также и последовательность измерений, если придется измерять напряжения различных источников.