Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/24: Рейтинг темы: голосов - 24, средняя оценка - 4.58
yozymmo
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
1

вопрос по си (блок инициа-ции в отдельный файл)

21.04.2012, 14:32. Просмотров 4386. Ответов 5
Метки нет (Все метки)

здравствуйте!
есть код:
Код
#include "stm32l1xx.h";
//------------------------------------------------------------------------------
int main(void)
{
RCC->AHBENR |= RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN| RCC_AHBENR_GPIOAEN;
GPIOC->MODER |=GPIO_MODER_MODER0_0;
GPIOC->MODER |=GPIO_MODER_MODER1_0;
GPIOB->MODER |=GPIO_MODER_MODER6_0;
GPIOC->MODER |=GPIO_MODER_MODER2_0;
GPIOC->MODER |=GPIO_MODER_MODER8_0;
GPIOC->MODER |=GPIO_MODER_MODER9_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR0_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR1_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR2_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR3_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR4_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR5_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR6_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR7_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR8_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR9_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR10_0;

GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR1_0|
GPIO_OSPEEDER_OSPEEDR2_0|
GPIO_OSPEEDER_OSPEEDR6_0 | GPIO_OSPEEDER_OSPEEDR7_0;
while (1)
{

GPIOC->BSRRL |=GPIO_BSRR_BS_0;
GPIOC->BSRRL |=GPIO_BSRR_BS_1;
GPIOC->ODR &=~GPIO_ODR_ODR_8;
GPIOB->ODR |=GPIO_ODR_ODR_6;
GPIOC->BSRRL |=GPIO_BSRR_BS_9;
for(int i=0;i<200000;i++){}
GPIOB->ODR &=~GPIO_ODR_ODR_7;
GPIOB->ODR &=~GPIO_ODR_ODR_6;
GPIOC->ODR |=GPIO_ODR_ODR_8;
for(int i=0;i<200000;i++){}
}

return 0;
}
как этот кусок установки разных регистров от nt main(void) до while (1) перенести в отдельный файл? ну и подключить к программе.
ранее пыталься, неполучилось.
есть-ли возможность присвоения в виде OSPEEDR= 0b000011110000111? Долго писать все эти определения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 14:32
Ответы с готовыми решениями:

Вопрос по выносу кода в отдельный файл
Вот если писать в С программу, очень много когда можно запутаться ... Можно...

Передача ф-ции как параметра другой ф-ции
struct pupil{ char surname; int school; int answer; int...

Составить блок схему и написать программу решения задачи: вычислить значение ф-ции
Здравствуйте, нужна помощь девушке, госы пишет. Такой вопрос : Составить блок...

Узнать в ф-ции имя вызвавшей ф-ции
Это возможно? Т.е. есть некая ф-ция debug(msg), передавать имя вызвавшей ее...

Вывести в отдельный файл, кто и когда вносил изменения в файл xls
уважаемые, кто подскажет или направит в нужном направлении Суть задачи. Вести...

5
kytikot
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 3,435
21.04.2012, 15:04 2
Вот так - вынести в отдельную функцию.

Код
//------------------------------------------------------------------------------
void   InitOtt(void)
{
RCC->AHBENR |= RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN| RCC_AHBENR_GPIOAEN;
GPIOC->MODER |=GPIO_MODER_MODER0_0;
GPIOC->MODER |=GPIO_MODER_MODER1_0;
GPIOB->MODER |=GPIO_MODER_MODER6_0;
GPIOC->MODER |=GPIO_MODER_MODER2_0;
GPIOC->MODER |=GPIO_MODER_MODER8_0;
GPIOC->MODER |=GPIO_MODER_MODER9_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR0_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR1_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR2_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR3_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR4_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR5_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR6_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR7_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR8_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR9_0;
GPIOC->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR10_0;

GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR1_0|
GPIO_OSPEEDER_OSPEEDR2_0|
GPIO_OSPEEDER_OSPEEDR6_0 | GPIO_OSPEEDER_OSPEEDR7_0;
}
//------------------------------------------------------------------------------

int main(void)
{
InitOtt();
while (1)
.................
Если надо - вынести функцию в отдельный файл, например, init.c
а в "главном прописать так

Код
#include  <stdyo.h>
....
#include "stm32l1xx.h"
......
#include "init.c"
.....

int   main(void)
{
....
InitOtt();
....
Да, и кстати, точка с запятой после директивы #include - НЕ нужна.
0
kytikot
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 3,435
21.04.2012, 15:13 3
Цитата Сообщение от yazymma
есть-ли возможность присвоения в виде OSPEEDR= 0b000011110000111? Долго писать все эти определения.
Запросто. Так и пиши. Компилятор на самом деле именно так и делает.

Только через месяц, когда ты вернешься к этому месту в программе - ты будешь долго "втыкать", что же ты именно определил этой битовой константой. А через год вообще забудешь.
А если ты еще этот код будешь кому-то отдавать - то никто вообще не сможет разобрать.

Можно чуть-чуть подправить - вместо наложения маски каждый раз, сделатиь это один раз - писать примерно так

GPIOC->OSPEEDR = ( GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR1_0 | GPIO_OSPEEDER_OSPEEDR2_0 );
0
yozymmo
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
21.04.2012, 18:03 4
Код
GPIOC->OSPEEDR = ( GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR1_0 | GPIO_OSPEEDER_OSPEEDR2_0 );
ох эти индусы%). Почти верно что будет через год. Прийдеться писать полностью, просто громадное место занимает программа в окне. А вот с другой стороны некоторые регистры портов В\В проще так записывать.Попутно- если мне надо установить первые 4 разряда регистра 32-битного, я могу опустить нули старших разрядов?
Код
GPIOC->OSPEEDR =0b1111
вместо
Код
GPIOC->OSPEEDR =0b00000000000000000000000000011111
0
kytikot
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 3,435
21.04.2012, 23:42 5
Цитата Сообщение от yazymma
Прийдеться писать полностью, просто громадное место занимает программа в окне. А вот с другой стороны некоторые регистры портов В\В проще так записывать.Попутно- если мне надо установить первые 4 разряда регистра 32-битного, я могу опустить нули старших разрядов?Код:
GPIOC->OSPEEDR =0b1111 вместо
Код
GPIOC->OSPEEDR =0b00000000000000000000000000011111
Пару раз напишешь полностью, потом будешь просто копировать из проекта в проект.
Насчет нулей в старших разрядах - да, можно.
Но везде, где возможно, биты лучше заменять ихними определениями.
Дело вот еще в чем - в разных моделях МК нужный бит может называться одинаково, а вот место занимать разное. При применении символьных мнемоник программа легче читается и легче переносится на другие "платформы".
0
dikor
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
22.04.2012, 11:08 6
Когда 32 бита регистра отвечает за 2 16 битных, то имеет смысл что-то вроде
Код
MY_32_REGISTR =
0b1011011111001100 //Регистр 1
| (0b1011011111001100 << 16)//Регистр 2
;
И вообще. Гораздо удобнее науиться читать 16ричную запись, а превращения 0xb = 0b1011 делать в голове и на автомате. Главное, запомнить, что одна цифар в hex - 4 в bin.
0
22.04.2012, 11:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2012, 11:08

Создать файл каталог книг, по году издания занести в отдельный файл данные
создайте файл каталог книг по заданному значению года издания занесите в...

Вывод сообщения в отдельный блок
Всем привет! Завис на казалось бы простейшей задаче. Не могу понять, туплю))) ...

Как сохранить файл настроек в отдельный свой файл?
Никто не подскажет как сохранить файл настроек Settings в отдельный файл? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru