|
|
  |
инициализировать структуру в ф-ии |
|
|
|
Oct 22 2016, 07:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
есть структура Код PWMConfig pwmcfg = { /// структура насройки ШИМ 10000, /* 10kHz PWM clock frequency. */ 100, /* Initial PWM period 1S. */ NULL, { {PWM_OUTPUT_ACTIVE_HIGH, NULL}, {PWM_OUTPUT_DISABLED, NULL}, {PWM_OUTPUT_DISABLED, NULL}, {PWM_OUTPUT_DISABLED, NULL} }, 0, 0, #if STM32_PWM_USE_ADVANCED 0 #endif }; но значения полей могут быть разные. Как можно вынести инициализацию в отд. ф-ю и с определенными параметрами полей инициализировать ее? Так то вынес, но саму переменную структуры не видит другая ф-я.
|
|
|
|
|
Oct 22 2016, 08:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Метценгерштейн @ Oct 22 2016, 10:38)  есть структура . . . Так то вынес, но саму переменную структуры не видит другая ф-я. Если она в глобальных - то как ОНО может "не видеть" - если в .h указано для вызывающих модулей-ф-ий что ОНО " extern" ? 1. Запихните все в класс. Там будет и сама структура (тотже класс без функций обработки), и всевозможные варианты реализации (видимость обеспечится "автоматически") 2. Если класс не подходит. В модуле, где объявлена структура, реализуйте ф-ию, которая возвращает указатель на Вашу структуру. PWMConfig * MDL1_GetPtrPWM_Struct(void) { return( &pwmcfg ); }; В вызывающих модулях эта ф-ия должна быть объявлена как extern Использовать: MDL1_GetPtrPWM_Struct()->field1 = ..... или любым другим способом.
|
|
|
|
|
Oct 22 2016, 09:39
|
Знающий
   
Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245

|
Цитата(Метценгерштейн @ Oct 22 2016, 10:38)  есть структура Код PWMConfig pwmcfg = { /// структура насройки ШИМ 10000, /* 10kHz PWM clock frequency. */ 100, /* Initial PWM period 1S. */ NULL, { {PWM_OUTPUT_ACTIVE_HIGH, NULL}, {PWM_OUTPUT_DISABLED, NULL}, {PWM_OUTPUT_DISABLED, NULL}, {PWM_OUTPUT_DISABLED, NULL} }, 0, 0, #if STM32_PWM_USE_ADVANCED 0 #endif }; Тут идет объявление структуры и ее инициализация начальными значениями, чтобы изменить в любой функции поля структуры, как вам сказали, либо передаете указатель структуру, либо она у вас глобальна и доступна всем функциям. Для изменения полей стуктуры, надо знать как она устроена, ищете где объявляется typedef PWMConfig и смотрите поля, код будет типа такого: Код pwmcfg.Pulse = 10000; pwmcfg.OCMode = 100; pwmcfg.OCPolarity = TIM_OCPOLARITY_HIGH; pwmcfg.OCNPolarity = TIM_OCNPOLARITY_HIGH; pwmcfg.OCIdleState = TIM_OCIDLESTATE_SET; pwmcfg.OCNIdleState= TIM_OCNIDLESTATE_RESET; pwmcfg.OCFastMode = TIM_OCFAST_DISABLE;
|
|
|
|
|
Oct 22 2016, 09:59
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
спасибо. Смысл выкладывать проект? Это chibios. Пробую ШИМ. нашел сам тип Код typedef struct { /** * @brief Timer clock in Hz. * @note The low level can use assertions in order to catch invalid * frequency specifications. */ uint32_t frequency; /** * @brief PWM period in ticks. * @note The low level can use assertions in order to catch invalid * period specifications. */ pwmcnt_t period; /** * @brief Periodic callback pointer. * @note This callback is invoked on PWM counter reset. If set to * @p NULL then the callback is disabled. */ pwmcallback_t callback; /** * @brief Channels configurations. */ PWMChannelConfig channels[PWM_CHANNELS]; /* End of the mandatory fields.*/ } PWMConfig;
|
|
|
|
|
Oct 22 2016, 11:01
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Код pwmcfg.channels[0].mode = PWM_OUTPUT_ACTIVE_HIGH; pwmcfg.channels[0].callback = NULL; структура изначально глобальная и сразу инициализирована была. В любой ф-ии можно поля переинициализировать так как привел. А нельзя как-то сразу инициализировать массив 0- {PWM_OUTPUT_ACTIVE_HIGH, NULL} Только каждое поле? В две строки?
|
|
|
|
|
Oct 22 2016, 11:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Метценгерштейн @ Oct 22 2016, 14:01)  Код pwmcfg.channels[0].mode = PWM_OUTPUT_ACTIVE_HIGH; pwmcfg.channels[0].callback = NULL; структура изначально глобальная и сразу инициализирована была. В любой ф-ии можно поля переинициализировать так как привел. А нельзя как-то сразу инициализировать массив 0- {PWM_OUTPUT_ACTIVE_HIGH, NULL} Только каждое поле? В две строки? memset( &pwmcfg, 0x00, sizeof(PWMConfig) ); - вся структура будет содержать 0x00. далее - устанавливаем те поля, что надо. pwmcfg.channels[0].mode = PWM_OUTPUT_ACTIVE_HIGH;
|
|
|
|
|
Oct 24 2016, 07:49
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Не уверен что праильно понял желание, но к примеру: Код PWMConfig pwmcfg = {...};
void InitPwmConfigType1(PWMConfig* pwmcfg) { PWMConfig inner_pwm_cfg = {...}; memcpy(pwmcfg, &inner_pwm_cfg, MIN(sizeof(*pwmcfg), sizeof(inner_pwm_cfg))); } то что хочется?
|
|
|
|
|
Oct 24 2016, 21:09
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390

|
Цитата(Метценгерштейн @ Oct 22 2016, 18:00)  а зачем обнулять поля структуры? Нельзя ли при объявлении структуры сразу ее инициализировать вне ф-ий, а уже непосредственно из некой ф-ии заменить только два поля? Код PWMConfig pwmcfg = {... .channels = { [0]{ .mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL}, [1]{ .mode = PWM_OUTPUT_ACTIVE_HIGH, .callback = NULL}, ... }, };
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|