OC_04_02

本文探讨了Objective-C与Swift两种编程语言在iOS开发领域的应用与区别,介绍了它们各自的特点、优势以及在实际项目中的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        /*
         构造字符串四种方式
            NSString 不可变字符串
         */
        
        //1.初始化一个字符串对象
        NSString *string1 = @"ibokanwisdom";
        
//        NSString *string2 = [NSString stringWithString:@"ibokanwisdom"];
//        NSString *string3 = [[NSString alloc] initWithString:@"ibokanwisdom"];
        
        //使用NSString的类方法来创建字符串,+ (instancetype)stringWithFormat:@"格式化标志符"
        NSString *string4 = [NSString stringWithFormat:@"%d,%f,hi guys",5,4.5];
        NSLog(@"string4 = %@",string4);
        
        //用格式化方式来构造字符串实例来讲,其作用并不仅仅来构造一个字符串对象,它还可以用来做字符串的拼接
        NSString *string5 = @"Yong";
        NSString *string6 = @"666";
        NSString *string7 = [NSString stringWithFormat:@"%@%@",string5,string6];
        NSLog(@"string7 = %@",string7);
        
        //从本地文件中读取字符串
        NSStringEncoding encoding;// NSUTF8StringEncoding 中国专用
        NSError *error;
        
        NSString *path1 = @"/Users/8011/Desktop/OC/OC_04_02/OC_04_02/t.html";
        NSString *string8 = [NSString stringWithContentsOfFile:path1 encoding:NSUTF8StringEncoding error:&error];
        NSLog(@"string8 = %@,error = %@",string8,error);
        
        //从网络读取字符串
//        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
//        NSString *string9 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
//        NSLog(@"string9 = %@",string9);
     
        
        //字符串的操作
        NSString *string10 = @"你是逗比么,我都受不了你了";
        
        //字符串属性   长度 length
        NSUInteger length = [string10 length];
        NSLog(@"length = %lu",length);
        
        //字符串的截取
        NSString *subString1 = [string10 substringToIndex:5];  //获取从字符串开头到字符串的to的位置的字符串内容,不包括to位置,并且从0开始算起
        NSLog(@"subString1 = %@",subString1);
        NSString *subString2 = [string10 substringFromIndex:6];//获取从字符串Form位置到结尾的字符串内容,包含Form位置的字符
        NSLog(@"subString2 = %@",subString2);
        NSString *subString3 = [string10 substringWithRange:NSMakeRange(2, 2)]; //前面2代表从哪里开始,后面2代表截多少个
        NSLog(@"subString3 = %@",subString3);
        
        //获取字符串的某个字符
        NSString *string12 = @"abcdefg";
        char c = [string12 characterAtIndex:0]; //根据字符串中的位置index来得到一个字符,注意字符串的索引是从0开始的
        NSLog(@"c = %c",c);
    
        //字符串比较,如何判断两个字符串是否相等
        if (subString2 == subString3) //内容和指针都相等时才成立
        {
            NSLog(@"subString2 和 subString3 相等");
        }
        else
        {
            NSLog(@"subString2 和 subString3 不相等");
        }
        
        /*
         如何才能让两个字符串的指针和内容都相等呢?(书p96)
         这里需要注意两个概念:  浅拷贝 和 深拷贝
         浅拷贝:是指源对象与拷贝对象公用一份实体,仅仅是引用的变量名称不同.
         
         深拷贝:是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另一个对象造成影响.
         
         在字符串中,[NSString stringWithString:] 方法用于浅拷贝一个现有的字符串产生一个字符串
         */
        
        NSString *subString4 = [NSString stringWithString:subString2];
        NSString *subString5 = [NSString stringWithFormat:@"%@",subString2];
        
        if (subString2 == subString5)
        {
            NSLog(@"subString2 和 subString5 相等");
        }
        else
        {
            NSLog(@"subString2 和 subString5 不相等");
        }
        
        //在实际开发过程中,我们通常只需要比较两个字符串的内容是否相等
        if ([subString2 isEqualToString:subString5])
        {
            NSLog(@"subString2 和 subString5 内容相等 ");
        }
        else
        {
           NSLog(@"subString2 和 subString5 内容不相等 ");
        }
        
        //比较两个字符串的大小
        NSString *cmpString1 = @"hehehehehehe";
        NSString *cmpString2 = @"hahahahahaha";
        
        NSComparisonResult result = [cmpString1 compare:cmpString2];
        switch (result) {
            case NSOrderedAscending:
            {
                NSLog(@"cmpString1 < cmpString2,升序");
            }
                break;
            case NSOrderedSame:
            {
                NSLog(@"cmpString1 = cmpString2");
            }
                break;
                case NSOrderedDescending:
            {
                NSLog(@"cmpString1 > cmpString2,降序");
            }
                break;
            default:
                break;
        }

        //根据字符串拿到对应的range
        //NSString *string10 = @"你是逗比么,我都受不了你了";
        
        NSRange range = [string10 rangeOfString:@"逗比"];
        NSLog(@"%@",[NSValue valueWithRange:range]);
        
        //只输出第一个遇到该字符串的位置 及 该字符串的长度
        NSRange range1 = [string10 rangeOfString:@"你"];
        NSLog(@"%@",[NSValue valueWithRange:range1]);
        
        //判断字符串中是否有XX前缀 或 XX后缀
        NSString *string13 = @"http://www.baidu.com";
        
        if ([string13 hasPrefix:@"http://"])
        {
            NSLog(@"含有此前缀");
        }
        else
        {
            NSLog(@"不含有此前缀");
        }
        
        //判断是否为 jpg 或 png 后缀
        NSString *string14 = @"dkjfkj.jpg";
        if ([string14 hasSuffix:@".jpg"] || [string14 hasSuffix:@"png"])
        {
            NSLog(@"含有此后缀");
        }
        else
        {
            NSLog(@"不含有此后缀");
        }
        
        //字符串的拼接
        NSString *string15 = @"www.baidu.com";
        NSString *string16 = [@"http://" stringByAppendingString:string15]; //直接把两个字符串连接起来,调用者在前,传进来的字符串在后
        NSLog(@"%@",string16);
        
        //http://img0.bdstatic.com/img/image/shouye/hbmnp003.jpg
        NSString *string17 = @"http://img0.bdstatic.com/img/image/shouye";
        NSString *string18 = @"hbmnp003.jpg";
        NSString *string19 = [string17 stringByAppendingFormat:@"/%@",string18];//连接两个字符串,并且第二个字符串是按一定格式传进来的
        NSLog(@"%@",string19);
    
        NSString *string20 = [string17 stringByAppendingPathComponent:string18];//连接两个字符串,自动生成(/)
        NSLog(@"%@",string20);
        
        NSString *string21 = @"http://img0.bdstatic.com/img/image/shouye/hbmnp003.jpg";
        NSString *string22 =[string21 lastPathComponent];//只读取最后一个反斜杠后面的内容
        NSLog(@"%@",string22);
        
        NSString *theImageName = @"Yong";
        NSString *theImageName2 =@"png";
        NSString *string23 = [theImageName stringByAppendingPathExtension:theImageName2];//连接两个字符串,自动生成(.)
        NSLog(@"%@",string23);
        
        //字符串的其他常用方法
        //1.字符串的转换函数
        NSString *str1 = @"111add333";
        int a1 = [str1 intValue];
        float b1 = [str1 floatValue];
        double c1 = [str1 doubleValue];
        
        NSLog(@"%d",a1);
        
        //字符串大小写转换函数
        NSString *str2 = @"aaabb";
        NSString *str3 = [str2 uppercaseString];//将字符全部改写成大写
        NSLog(@"%@",str3);
        
        NSString *str4 = [str3 lowercaseString];//将字符全部改成小写
        NSLog(@"%@",str4);
        
        NSString *str5 = [str2 capitalizedString];//将首个字符改写成大写,其余的都小写
        NSLog(@"%@",str5);
        
        //字符串的替换函数
        NSString *str6 = [str2 stringByReplacingOccurrencesOfString:@"bb" withString:@"dd"];
        NSLog(@"%@",str6);
        
        NSString *str7 = [str2 stringByReplacingCharactersInRange:NSMakeRange(1, 2) withString:@"cc"];//将原字符串中range范围内的内容替换为replacement的内容
        NSLog(@"%@",str7);
        
        NSString *str8 = @"aa-bb-cc-dd-ee";
        NSArray *array = [str8 componentsSeparatedByString:@"-"];//以separator为分隔符,将原字符的内容进行分割,分割得到的结果放到一个数组里,作为返回值
        NSLog(@"array = %@",array);
        
        
        
        
        
    }
    return 0;
}
; 乒乓球游戏汇编代码 ; 使用MASM语法,针对DOS环境 .MODEL SMALL .STACK 100H .DATA ; 端口地址定义 pa EQU 280H pb EQU 281H pc EQU 282H pn1 EQU 283H p0 EQU 288H p1 EQU 289H p2 EQU 28AH pn2 EQU 28BH ; 数码管编码表 s DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,7BH,71H ; 全局变量 led DB 0 f DW 1 ; 移动方向标志 s1 DW 50 ; 初始速度 m DW 0 ; 甲得分 n DW 0 ; 乙得分 msg DB ‘Please serve!’,0DH,0AH,‘$’ .CODE STARTUP: MOV AX, @DATA MOV DS, AX ; 初始化8255 MOV DX, pn1 MOV AL, 81H ; A/B口输出,C口输入 OUT DX, AL ; 初始化8253定时器 MOV DX, pn2 MOV AL, 36H ; 计数器0,方式3 OUT DX, AL MOV DX, p0 MOV AX, 1193 ; 1MHz时钟,产生50Hz中断 OUT DX, AL MOV AL, AH OUT DX, AL MAIN_LOOP: ; 显示发球提示 MOV AH, 09H MOV DX, OFFSET msg INT 21H CALL START ; 等待发球 GAME_LOOP: MOV DX, pb MOV AL, led OUT DX, AL ; 更新LED状态 ; 数码管动态显示 CALL SCOREM CALL DELAY CALL SCOREN CALL DELAY ; 检测击球 MOV DX, pc IN AL, DX CMP f, 1 JNE CHECK_RIGHT ; 向左移动时检测乙击球(PC1) TEST AL, 02H JZ MOVE_BALL MOV f, 0 ; 改变方向 JMP MOVE_BALL CHECK_RIGHT: ; 向右移动时检测甲击球(PC0) TEST AL, 01H JZ MOVE_BALL MOV f, 1 MOVE_BALL: CALL LEDDIC ; 移动球位置 CALL OUT_CHECK ; 得分检测 CMP led, 0 ; 检查球是否出界 JNE GAME_LOOP JMP MAIN_LOOP ; 开始新回合 MOV AH, 4CH ; 退出程序 INT 21H ; LED移动函数 LEDDIC PROC NEAR CMP f, 1 JE LEFT SHR led, 1 ; 右移 JMP EXIT_LED LEFT: SHL led, 1 ; 左移 EXIT_LED: RET LEDDIC ENDP ; 数码管显示延时 DELAY PROC NEAR PUSH CX MOV CX, 500 DLOOP: LOOP DLOOP POP CX RET DELAY ENDP ; 显示甲得分 SCOREM PROC NEAR MOV DX, pc MOV AL, 20H ; 开启高位数码管 OUT DX, AL MOV BX, m MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREM ENDP ; 显示乙得分 SCOREN PROC NEAR MOV DX, pc MOV AL, 10H ; 开启低位数码管 OUT DX, AL MOV BX, n MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREN ENDP ; 发球检测(带去抖动) START PROC NEAR START_LOOP: MOV DX, pc IN AL, DX TEST AL, 01H ; 检测甲发球 JZ CHECK_PC1 CALL DEBOUNCE TEST AL, 01H JZ CHECK_PC1 MOV led, 80H ; 甲发球位置 MOV f, 0 ; 初始向右移动 JMP START_EXIT CHECK_PC1: TEST AL, 02H ; 检测乙发球 JZ START_LOOP CALL DEBOUNCE TEST AL, 02H JZ START_LOOP MOV led, 01H ; 乙发球位置 MOV f, 1 ; 初始向左移动 START_EXIT: RET START ENDP ; 按键去抖动 DEBOUNCE PROC NEAR PUSH CX MOV CX, 1000 DB_LOOP: LOOP DB_LOOP POP CX RET DEBOUNCE ENDP ; 得分判断 OUT_CHECK PROC NEAR CMP led, 0 JNE OC_EXIT CMP f, 1 JNE PLAYER_A INC n ; 乙得分 JMP SCORE_CHECK PLAYER_A: INC m ; 甲得分 SCORE_CHECK: ; 胜负判断(11分制,领先2分) MOV AX, m CMP AX, 11 JL CHECK_N MOV BX, n SUB AX, BX CMP AX, 2 JGE RESET JMP OC_EXIT CHECK_N: MOV AX, n CMP AX, 11 JL OC_EXIT MOV BX, m SUB AX, BX CMP AX, 2 JL OC_EXIT RESET: MOV m, 0 MOV n, 0 OC_EXIT: RET OUT_CHECK ENDP END优化此代码 使此代码利用8253clock0为1MHz,out0与clock1的串联 实现输出2hz方波 并实现led的移动速度为0.5s ,任意一方领先两分或得到11分时结束游戏 给出修改后全部的代码
04-03
/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-12-13 zylx first version */ #include <board.h> #include<rtthread.h> #include<rtdevice.h> #ifdef RT_USING_PWM #include "drv_config.h" //#define DRV_DEBUG #define LOG_TAG "drv.pwm" #include <drv_log.h> #define MAX_PERIOD 65535 #define MIN_PERIOD 3 #define MIN_PULSE 2 extern void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); enum { #ifdef BSP_USING_PWM1 PWM1_INDEX, #endif #ifdef BSP_USING_PWM2 PWM2_INDEX, #endif #ifdef BSP_USING_PWM3 PWM3_INDEX, #endif #ifdef BSP_USING_PWM4 PWM4_INDEX, #endif #ifdef BSP_USING_PWM5 PWM5_INDEX, #endif #ifdef BSP_USING_PWM6 PWM6_INDEX, #endif #ifdef BSP_USING_PWM7 PWM7_INDEX, #endif #ifdef BSP_USING_PWM8 PWM8_INDEX, #endif #ifdef BSP_USING_PWM9 PWM9_INDEX, #endif #ifdef BSP_USING_PWM10 PWM10_INDEX, #endif #ifdef BSP_USING_PWM11 PWM11_INDEX, #endif #ifdef BSP_USING_PWM12 PWM12_INDEX, #endif #ifdef BSP_USING_PWM13 PWM13_INDEX, #endif #ifdef BSP_USING_PWM14 PWM14_INDEX, #endif #ifdef BSP_USING_PWM15 PWM15_INDEX, #endif #ifdef BSP_USING_PWM16 PWM16_INDEX, #endif #ifdef BSP_USING_PWM17 PWM17_INDEX, #endif }; struct stm32_pwm { struct rt_device_pwm pwm_device; TIM_HandleTypeDef tim_handle; rt_uint8_t channel; char *name; }; static struct stm32_pwm stm32_pwm_obj[] = { #ifdef BSP_USING_PWM1 PWM1_CONFIG, #endif #ifdef BSP_USING_PWM2 PWM2_CONFIG, #endif #ifdef BSP_USING_PWM3 PWM3_CONFIG, #endif #ifdef BSP_USING_PWM4 PWM4_CONFIG, #endif #ifdef BSP_USING_PWM5 PWM5_CONFIG, #endif #ifdef BSP_USING_PWM6 PWM6_CONFIG, #endif #ifdef BSP_USING_PWM7 PWM7_CONFIG, #endif #ifdef BSP_USING_PWM8 PWM8_CONFIG, #endif #ifdef BSP_USING_PWM9 PWM9_CONFIG, #endif #ifdef BSP_USING_PWM10 PWM10_CONFIG, #endif #ifdef BSP_USING_PWM11 PWM11_CONFIG, #endif #ifdef BSP_USING_PWM12 PWM12_CONFIG, #endif #ifdef BSP_USING_PWM13 PWM13_CONFIG, #endif #ifdef BSP_USING_PWM14 PWM14_CONFIG, #endif #ifdef BSP_USING_PWM15 PWM15_CONFIG, #endif #ifdef BSP_USING_PWM16 PWM16_CONFIG, #endif #ifdef BSP_USING_PWM17 PWM17_CONFIG, #endif }; static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg); static struct rt_pwm_ops drv_ops = { drv_pwm_control }; static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration, rt_bool_t enable) { /* Converts the channel number to the channel number of Hal library */ rt_uint32_t channel = 0x04 * (configuration->channel - 1); if (!enable) { HAL_TIM_PWM_Stop(htim, channel); } else { HAL_TIM_PWM_Start(htim, channel); } return RT_EOK; } static rt_err_t drv_pwm_get(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration) { /* Converts the channel number to the channel number of Hal library */ rt_uint32_t channel = 0x04 * (configuration->channel - 1); rt_uint64_t tim_clock; #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11) #elif defined(SOC_SERIES_STM32L4) if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17) #elif defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) if (0) #endif { #if !defined(SOC_SERIES_STM32F0) && !defined(SOC_SERIES_STM32G0) tim_clock = HAL_RCC_GetPCLK2Freq() * 2; #endif } else { #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) tim_clock = HAL_RCC_GetPCLK1Freq(); #else tim_clock = HAL_RCC_GetPCLK1Freq() * 2; #endif } if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV2) { tim_clock = tim_clock / 2; } else if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV4) { tim_clock = tim_clock / 4; } /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ tim_clock /= 1000000UL; configuration->period = (__HAL_TIM_GET_AUTORELOAD(htim) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock; configuration->pulse = (__HAL_TIM_GET_COMPARE(htim, channel) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock; return RT_EOK; } static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration) { rt_uint32_t period, pulse; rt_uint64_t tim_clock, psc; /* Converts the channel number to the channel number of Hal library */ rt_uint32_t channel = 0x04 * (configuration->channel - 1); #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11) #elif defined(SOC_SERIES_STM32L4) if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17) #elif defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) if (0) #endif { #if !defined(SOC_SERIES_STM32F0) && !defined(SOC_SERIES_STM32G0) tim_clock = HAL_RCC_GetPCLK2Freq() * 2; #endif } else { #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) tim_clock = HAL_RCC_GetPCLK1Freq(); #else tim_clock = HAL_RCC_GetPCLK1Freq() * 2; #endif } /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ tim_clock /= 1000000UL; period = (unsigned long long)configuration->period * tim_clock / 1000ULL ; psc = period / MAX_PERIOD + 1; period = period / psc; __HAL_TIM_SET_PRESCALER(htim, psc - 1); if (period < MIN_PERIOD) { period = MIN_PERIOD; } __HAL_TIM_SET_AUTORELOAD(htim, period - 1); pulse = (unsigned long long)configuration->pulse * tim_clock / psc / 1000ULL; if (pulse < MIN_PULSE) { pulse = MIN_PULSE; } else if (pulse > period) { pulse = period; } __HAL_TIM_SET_COMPARE(htim, channel, pulse - 1); __HAL_TIM_SET_COUNTER(htim, 0); /* Update frequency value */ HAL_TIM_GenerateEvent(htim, TIM_EVENTSOURCE_UPDATE); return RT_EOK; } static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) { struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg; TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)device->parent.user_data; switch (cmd) { case PWM_CMD_ENABLE: return drv_pwm_enable(htim, configuration, RT_TRUE); case PWM_CMD_DISABLE: return drv_pwm_enable(htim, configuration, RT_FALSE); case PWM_CMD_SET: return drv_pwm_set(htim, configuration); case PWM_CMD_GET: return drv_pwm_get(htim, configuration); default: return RT_EINVAL; } } static rt_err_t stm32_hw_pwm_init(struct stm32_pwm *device) { rt_err_t result = RT_EOK; TIM_HandleTypeDef *tim = RT_NULL; TIM_OC_InitTypeDef oc_config = {0}; TIM_MasterConfigTypeDef master_config = {0}; TIM_ClockConfigTypeDef clock_config = {0}; RT_ASSERT(device != RT_NULL); tim = (TIM_HandleTypeDef *)&device->tim_handle; /* configure the timer to pwm mode */ tim->Init.Prescaler = 0; tim->Init.CounterMode = TIM_COUNTERMODE_UP; tim->Init.Period = 0; tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) tim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; #endif if (HAL_TIM_PWM_Init(tim) != HAL_OK) { LOG_E("%s pwm init failed", device->name); result = -RT_ERROR; goto __exit; } clock_config.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(tim, &clock_config) != HAL_OK) { LOG_E("%s clock init failed", device->name); result = -RT_ERROR; goto __exit; } master_config.MasterOutputTrigger = TIM_TRGO_RESET; master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(tim, &master_config) != HAL_OK) { LOG_E("%s master config failed", device->name); result = -RT_ERROR; goto __exit; } oc_config.OCMode = TIM_OCMODE_PWM1; oc_config.Pulse = 0; oc_config.OCPolarity = TIM_OCPOLARITY_HIGH; oc_config.OCFastMode = TIM_OCFAST_DISABLE; oc_config.OCNIdleState = TIM_OCNIDLESTATE_RESET; oc_config.OCIdleState = TIM_OCIDLESTATE_RESET; /* config pwm channel */ if (device->channel & 0x01) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_1) != HAL_OK) { LOG_E("%s channel1 config failed", device->name); result = -RT_ERROR; goto __exit; } } if (device->channel & 0x02) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_2) != HAL_OK) { LOG_E("%s channel2 config failed", device->name); result = -RT_ERROR; goto __exit; } } if (device->channel & 0x04) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_3) != HAL_OK) { LOG_E("%s channel3 config failed", device->name); result = -RT_ERROR; goto __exit; } } if (device->channel & 0x08) { if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_4) != HAL_OK) { LOG_E("%s channel4 config failed", device->name); result = -RT_ERROR; goto __exit; } } /* pwm pin configuration */ HAL_TIM_MspPostInit(tim); /* enable update request source */ __HAL_TIM_URS_ENABLE(tim); __exit: return result; } static void pwm_get_channel(void) { #ifdef BSP_USING_PWM1_CH1 stm32_pwm_obj[PWM1_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM1_CH2 stm32_pwm_obj[PWM1_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM1_CH3 stm32_pwm_obj[PWM1_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM1_CH4 stm32_pwm_obj[PWM1_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM2_CH1 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM2_CH2 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM2_CH3 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM2_CH4 stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM3_CH1 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM3_CH2 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM3_CH3 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM3_CH4 stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM4_CH1 stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM4_CH2 stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM4_CH3 stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM4_CH4 stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM5_CH1 stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM5_CH2 stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM5_CH3 stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM5_CH4 stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM6_CH1 stm32_pwm_obj[PWM6_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM6_CH2 stm32_pwm_obj[PWM6_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM6_CH3 stm32_pwm_obj[PWM6_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM6_CH4 stm32_pwm_obj[PWM6_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM7_CH1 stm32_pwm_obj[PWM7_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM7_CH2 stm32_pwm_obj[PWM7_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM7_CH3 stm32_pwm_obj[PWM7_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM7_CH4 stm32_pwm_obj[PWM7_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM8_CH1 stm32_pwm_obj[PWM8_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM8_CH2 stm32_pwm_obj[PWM8_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM8_CH3 stm32_pwm_obj[PWM8_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM8_CH4 stm32_pwm_obj[PWM8_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM9_CH1 stm32_pwm_obj[PWM9_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM9_CH2 stm32_pwm_obj[PWM9_INDEX].channel |= 1 << 1; #endif #ifdef BSP_USING_PWM9_CH3 stm32_pwm_obj[PWM9_INDEX].channel |= 1 << 2; #endif #ifdef BSP_USING_PWM9_CH4 stm32_pwm_obj[PWM9_INDEX].channel |= 1 << 3; #endif #ifdef BSP_USING_PWM12_CH1 stm32_pwm_obj[PWM12_INDEX].channel |= 1 << 0; #endif #ifdef BSP_USING_PWM12_CH2 stm32_pwm_obj[PWM12_INDEX].channel |= 1 << 1; #endif } static int stm32_pwm_init(void) { int i = 0; int result = RT_EOK; pwm_get_channel(); for (i = 0; i < sizeof(stm32_pwm_obj) / sizeof(stm32_pwm_obj[0]); i++) { /* pwm init */ if (stm32_hw_pwm_init(&stm32_pwm_obj[i]) != RT_EOK) { LOG_E("%s init failed", stm32_pwm_obj[i].name); result = -RT_ERROR; goto __exit; } else { LOG_D("%s init success", stm32_pwm_obj[i].name); /* register pwm device */ if (rt_device_pwm_register(&stm32_pwm_obj[i].pwm_device, stm32_pwm_obj[i].name, &drv_ops, &stm32_pwm_obj[i].tim_handle) == RT_EOK) { LOG_D("%s register success", stm32_pwm_obj[i].name); } else { LOG_E("%s register failed", stm32_pwm_obj[i].name); result = -RT_ERROR; } } } __exit: return result; } INIT_DEVICE_EXPORT(stm32_pwm_init); #endif /* RT_USING_PWM */ 这段出现很多报错是什么原因
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值