Настроил таймер и порт с помощью 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;
}
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 (); ((((
Интересно, кстати, замечено.. Я все глаза высмотрел - не увидел. Вот что опыт животворящий делает, однако! =) dosikus, спасибо за ссылку. Мне что-то все старые материалы попадались (которые, гм, не без ошибок).
(Вы, кстати, не модератор на одном из подобных сайтов, аль обознался я?) Victor Gordienko, оно сложно конечно, сходу не получится, наверное. Но вот АЦП достаточно просто запустить (без заковыристых режимов) - я как раз добился нормальной работы оного. Только над документацией сидеть долго придется, я уже забыл как пахнет разогретый паяльник. Все бумажки да бумажки. Чувствую, после этого зверя об АВР-ах позабуду напрочь.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
SubDia писал(а):Интересно, кстати, замечено.. Я все глаза высмотрел - не увидел. Вот что опыт животворящий делает, однако! =) dosikus, спасибо за ссылку. Мне что-то все старые материалы попадались (которые, гм, не без ошибок).
(Вы, кстати, не модератор на одном из подобных сайтов, аль обознался я?) Victor Gordienko, оно сложно конечно, сходу не получится, наверное. Но вот АЦП достаточно просто запустить (без заковыристых режимов) - я как раз добился нормальной работы оного. Только над документацией сидеть долго придется, я уже забыл как пахнет разогретый паяльник. Все бумажки да бумажки. Чувствую, после этого зверя об АВР-ах позабуду напрочь.
Скинуть исходник могу, конечно. Да только работаю я в IAR, во-первых; во-вторых - кроме АЦП, у меня там еще UART, кнопка, и прерывания по UART и EXTI. Много мешанины, Вам ненужной, хотя комментарии писал к каждой строке практически.
Могу вычленить инициализацию АЦП (и дальнейший его запуск), и в виде кода оформить в сообщении. Если будет угодно.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
SubDia писал(а):Скинуть исходник могу, конечно. Да только работаю я в IAR, во-первых; во-вторых - кроме АЦП, у меня там еще UART, кнопка, и прерывания по UART и EXTI. Много мешанины, Вам ненужной, хотя комментарии писал к каждой строке практически.
Могу вычленить инициализацию АЦП (и дальнейший его запуск), и в виде кода оформить в сообщении. Если будет угодно.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
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), так как использую внешний кварц.
А все остальное - посмотрите по описанию регистров АЦП, все прояснится.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
Большое спасибо ) Вроде все понял кроме того как выбрать канал АЦП
ADC1->SQR3 |= (ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3); не могли бы Вы объяснить эту строчку, или как выбрать другой канал ?
Да, конечно, поясню.
В общем, мы имеем возможность производить до 16 измерений последовательно - от 0 до 15 (считайте, что это общее количество каналов). В регистрах SQR1..SQR3 у нас находятся "ячейки" всех 16 преобразований. Область первого преобразования находится в регистре SQR3 (SQ1). А чтобы выбрать канал № 10, нужно в эту "ячейку" записать число 1010 = 10. То есть строкой
я устанавливаю первый и третий биты в этой "ячейке", получая таким образом число 1010 (в двоичном виде), либо 10 - в десятичном виде. Это номер канала.
Если Вы захотите выбрать, к примеру, канал № 6, тогда Вам нужно будет эту строку видоизменить следующим образом:
, записывая туда число 0110 = 6.
Учитывайте также и последовательность измерений, если придется измерять напряжения различных источников.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )