Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 22:40

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: вопрос по си (блок инициа-ции в отдельный файл)
СообщениеДобавлено: 22 апр 2012, 14:19 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
здравствуйте!
есть код:
Код:

#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? Долго писать все эти определения.

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по си (блок инициа-ции в отдельный файл)
СообщениеДобавлено: 22 апр 2012, 14:51 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4945
Откуда: Донецк-Мариуполь
Вот так - вынести в отдельную функцию.

Код:

//------------------------------------------------------------------------------
void   InitAll(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)
{
   InitAll();
while (1)
.................


Если надо - вынести функцию в отдельный файл, например, init.c
а в "главном прописать так

Код:

#include  <stdio.h>
....
#include "stm32l1xx.h"
......
#include "init.c"
.....

int   main(void)
{
....
   InitAll();
....




Да, и кстати, точка с запятой после директивы #include - НЕ нужна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по си (блок инициа-ции в отдельный файл)
СообщениеДобавлено: 22 апр 2012, 15:00 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4945
Откуда: Донецк-Мариуполь
yazimma писал(а):
есть-ли возможность присвоения в виде OSPEEDR= 0b000011110000111? Долго писать все эти определения.


Запросто. Так и пиши. Компилятор на самом деле именно так и делает.

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

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

GPIOC->OSPEEDR = ( GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR1_0 | GPIO_OSPEEDER_OSPEEDR2_0 );


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по си (блок инициа-ции в отдельный файл)
СообщениеДобавлено: 22 апр 2012, 17:50 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
Код:
GPIOC->OSPEEDR = ( GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR1_0 | GPIO_OSPEEDER_OSPEEDR2_0 );
ох эти индусы%). Почти верно что будет через год. Прийдеться писать полностью, просто громадное место занимает программа в окне. А вот с другой стороны некоторые регистры портов В\В проще так записывать.Попутно- если мне надо установить первые 4 разряда регистра 32-битного, я могу опустить нули старших разрядов?
Код:
GPIOC->OSPEEDR =0b1111
вместо
Код:
GPIOC->OSPEEDR =0b00000000000000000000000000011111

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по си (блок инициа-ции в отдельный файл)
СообщениеДобавлено: 22 апр 2012, 23:29 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4945
Откуда: Донецк-Мариуполь
yazimma писал(а):
Прийдеться писать полностью, просто громадное место занимает программа в окне. А вот с другой стороны некоторые регистры портов В\В проще так записывать.Попутно- если мне надо установить первые 4 разряда регистра 32-битного, я могу опустить нули старших разрядов?
Код:
GPIOC->OSPEEDR =0b1111
вместо
Код:
GPIOC->OSPEEDR =0b00000000000000000000000000011111


Пару раз напишешь полностью, потом будешь просто копировать из проекта в проект.
Насчет нулей в старших разрядах - да, можно.
Но везде, где возможно, биты лучше заменять ихними определениями.
Дело вот еще в чем - в разных моделях МК нужный бит может называться одинаково, а вот место занимать разное. При применении символьных мнемоник программа легче читается и легче переносится на другие "платформы".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по си (блок инициа-ции в отдельный файл)
СообщениеДобавлено: 23 апр 2012, 10:55 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1161
Откуда: Default city
Когда 32 бита регистра отвечает за 2 16 битных, то имеет смысл что-то вроде
Код:
MY_32_REGISTR =
           0b1011011111001100 //Регистр 1
         | (0b1011011111001100 << 16)//Регистр 2
                                 ;


И вообще. Гораздо удобнее науиться читать 16ричную запись, а превращения 0xb = 0b1011 делать в голове и на автомате. Главное, запомнить, что одна цифар в hex - 4 в bin.

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB