亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pwmc.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
字號:
/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include "pwmc.h"
#include <board.h>
#include <utility/assert.h>
#include <utility/trace.h>

//------------------------------------------------------------------------------
//         Local functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Finds a prescaler/divisor couple to generate the desired frequency from
/// MCK.
/// Returns the value to enter in PWMC_MR or 0 if the configuration cannot be
/// met.
/// \param frequency  Desired frequency in Hz.
/// \param mck  Master clock frequency in Hz.
//------------------------------------------------------------------------------
static unsigned short FindClockConfiguration(
    unsigned int frequency,
    unsigned int mck)
{
    unsigned int divisors[11] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};
    unsigned char divisor = 0;
    unsigned int prescaler;

    SANITY_CHECK(frequency < mck);

    // Find prescaler and divisor values
    prescaler = (mck / divisors[divisor]) / frequency;
    while ((prescaler > 255) && (divisor < 11)) {

        divisor++;
        prescaler = (mck / divisors[divisor]) / frequency;
    }

    // Return result
    if (divisor < 11) {

        trace_LOG(trace_DEBUG, "-D- Found divisor=%u and prescaler=%u for freq=%uHz\n\r",
                  divisors[divisor], prescaler, frequency);
        return prescaler | (divisor << 8);
    }
    else {

        return 0;
    }
}

//------------------------------------------------------------------------------
//         Global functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Configures PWM a channel with the given parameters.
/// The PWM controller must have been clocked in the PMC prior to calling this
/// function.
/// \param channel  Channel number.
/// \param prescaler  Channel prescaler.
/// \param alignment  Channel alignment.
/// \param polarity  Channel polarity.
//------------------------------------------------------------------------------
void PWMC_ConfigureChannel(
    unsigned char channel,
    unsigned int prescaler,
    unsigned int alignment,
    unsigned int polarity)
{
    SANITY_CHECK(prescaler < AT91C_PWMC_CPRE_MCKB);
    SANITY_CHECK((alignment & ~AT91C_PWMC_CALG) == 0);
    SANITY_CHECK((polarity & ~AT91C_PWMC_CPOL) == 0);

    // Disable channel
    AT91C_BASE_PWMC->PWMC_DIS = 1 << channel;

    // Configure channel
    AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CMR = prescaler | alignment | polarity;
}

//------------------------------------------------------------------------------
/// Configures PWM clocks A & B to run at the given frequencies. This function
/// finds the best MCK divisor and prescaler values automatically.
/// \param clka  Desired clock A frequency (0 if not used).
/// \param clkb  Desired clock B frequency (0 if not used).
/// \param mck  Master clock frequency.
//------------------------------------------------------------------------------
void PWMC_ConfigureClocks(unsigned int clka, unsigned int clkb, unsigned int mck)
{
    unsigned int mode = 0;
    unsigned int result;

    // Clock A
    if (clka != 0) {

        result = FindClockConfiguration(clka, mck);
        ASSERT(result != 0, "-F- Could not generate the desired PWM frequency (%uHz)\n\r", clka);
        mode |= result;
    }

    // Clock B
    if (clkb != 0) {

        result = FindClockConfiguration(clkb, mck);
        ASSERT(result != 0, "-F- Could not generate the desired PWM frequency (%uHz)\n\r", clkb);
        mode |= (result << 16);
    }

    // Configure clocks
    trace_LOG(trace_DEBUG, "-D- Setting PWMC_MR = 0x%08X\n\r", mode);
    AT91C_BASE_PWMC->PWMC_MR = mode;
}

//------------------------------------------------------------------------------
/// Sets the period value used by a PWM channel. This function writes directly
/// to the CPRD register if the channel is disabled; otherwise, it uses the
/// update register CUPD.
/// \param channel  Channel number.
/// \param period  Period value.
//------------------------------------------------------------------------------
void PWMC_SetPeriod(unsigned char channel, unsigned short period)
{
    // If channel is disabled, write to CPRD
    if ((AT91C_BASE_PWMC->PWMC_SR & (1 << channel)) == 0) {

        AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CPRDR = period;
    }
    // Otherwise use update register
    else {

        AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CMR |= AT91C_PWMC_CPD;
        AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CUPDR = period;
    }
}

//------------------------------------------------------------------------------
/// Sets the duty cycle used by a PWM channel. This function writes directly to
/// the CDTY register if the channel is disabled; otherwise it uses the
/// update register CUPD.
/// Note that the duty cycle must always be inferior or equal to the channel
/// period.
/// \param channel  Channel number.
/// \param duty  Duty cycle value.
//------------------------------------------------------------------------------
void PWMC_SetDutyCycle(unsigned char channel, unsigned short duty)
{
    SANITY_CHECK(duty <= AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CPRDR);

    // SAM7S errata
#if defined(at91sam7s16) || defined(at91sam7s161) || defined(at91sam7s32) \
    || defined(at91sam7s321) || defined(at91sam7s64) || defined(at91sam7s128) \
    || defined(at91sam7s256) || defined(at91sam7s512)
    ASSERT(duty > 0, "-F- Duty cycle value 0 is not permitted on SAM7S chips.\n\r");
    ASSERT((duty > 1) || (AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CMR & AT91C_PWMC_CALG),
           "-F- Duty cycle value 1 is not permitted in left-aligned mode on SAM7S chips.\n\r");
#endif

    // If channel is disabled, write to CDTY
    if ((AT91C_BASE_PWMC->PWMC_SR & (1 << channel)) == 0) {

        AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CDTYR = duty;
    }
    // Otherwise use update register
    else {

        AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CMR &= ~AT91C_PWMC_CPD;
        AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CUPDR = duty;
    }
}

//------------------------------------------------------------------------------
/// Enables the given PWM channel. This does NOT enable the corresponding pin;
/// this must be done in the user code.
/// \param channel  Channel number.
//------------------------------------------------------------------------------
void PWMC_EnableChannel(unsigned char channel)
{
    AT91C_BASE_PWMC->PWMC_ENA = 1 << channel;
}

//------------------------------------------------------------------------------
/// Disables the given PWM channel.
/// \param channel  Channel number.
//------------------------------------------------------------------------------
void PWMC_DisableChannel(unsigned char channel)
{
    AT91C_BASE_PWMC->PWMC_DIS = 1 << channel;
}

//------------------------------------------------------------------------------
/// Enables the period interrupt for the given PWM channel.
/// \param channel  Channel number.
//------------------------------------------------------------------------------
void PWMC_EnableChannelIt(unsigned char channel)
{
    AT91C_BASE_PWMC->PWMC_IER = 1 << channel;
}

//------------------------------------------------------------------------------
/// Disables the period interrupt for the given PWM channel.
/// \param channel  Channel number.
//------------------------------------------------------------------------------
void PWMC_DisableChannelIt(unsigned char channel)
{
    AT91C_BASE_PWMC->PWMC_IDR = 1 << channel;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩久久久精品| 国产精品久久久99| 91麻豆免费看片| 美女在线视频一区| 亚洲一二三四在线| 欧美国产日韩精品免费观看| 日韩欧美中文一区二区| 一本久久a久久免费精品不卡| 国产黄人亚洲片| 久久精工是国产品牌吗| 悠悠色在线精品| 国产精品福利电影一区二区三区四区| 日韩精品影音先锋| 欧美日韩成人综合在线一区二区| 99久久精品国产精品久久| 韩国成人精品a∨在线观看| 一区二区三区四区不卡在线 | 国产精品亚洲人在线观看| 午夜视频在线观看一区二区三区| 中文字幕一区二区在线播放| 久久综合久色欧美综合狠狠| 91精品国产综合久久久久久漫画| 欧美中文字幕亚洲一区二区va在线 | 亚洲国产精品久久艾草纯爱| 中文字幕一区二区三区在线播放| 久久久精品天堂| 久久久不卡网国产精品二区| 精品国产免费人成电影在线观看四季 | 成人免费视频caoporn| 精品一区二区国语对白| 日韩vs国产vs欧美| 蜜桃视频第一区免费观看| 午夜久久久久久久久| 亚洲一区中文日韩| 亚洲一区在线视频观看| 一区二区三区av电影| 悠悠色在线精品| 亚洲妇女屁股眼交7| 亚洲午夜视频在线观看| 亚洲午夜视频在线| 午夜欧美视频在线观看| 亚洲电影第三页| 日本在线不卡视频| 欧美aa在线视频| 狠狠色丁香婷综合久久| 国产一区亚洲一区| 国产99久久久国产精品| 高清成人免费视频| 成人激情图片网| 91色婷婷久久久久合中文| 色噜噜夜夜夜综合网| 在线免费精品视频| 欧美精品tushy高清| 日韩一级二级三级| 久久久综合视频| 综合亚洲深深色噜噜狠狠网站| 综合久久给合久久狠狠狠97色 | 欧美精品在欧美一区二区少妇| 欧美日韩在线播放三区四区| 在线观看91av| 精品国产乱码久久久久久图片| 久久久国产精品麻豆| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 中文字幕中文乱码欧美一区二区| 亚洲免费三区一区二区| 午夜亚洲国产au精品一区二区 | 91视频免费看| 欧美酷刑日本凌虐凌虐| 精品久久久久久久久久久院品网| 国产亚洲一区字幕| 亚洲综合免费观看高清完整版在线 | 亚洲福利视频导航| 久久99久久久欧美国产| 成人精品免费网站| 欧美系列一区二区| 2020国产精品| 亚洲免费av网站| 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩美女主播在线视频一区二区三区| 欧美精品一区二| 亚洲精品菠萝久久久久久久| 免费观看日韩电影| 97精品国产97久久久久久久久久久久 | 中文字幕av一区二区三区高 | 亚洲视频图片小说| 日本不卡123| 91视频国产资源| 2020日本不卡一区二区视频| 一区二区三区欧美视频| 韩国视频一区二区| 欧美日韩国产综合一区二区| 久久色在线视频| 亚洲国产日韩在线一区模特| 国产成人综合在线观看| 欧美日韩国产成人在线免费| 国产精品美日韩| 老鸭窝一区二区久久精品| 在线精品视频一区二区| 久久精品日韩一区二区三区| 日韩在线一二三区| 91视视频在线直接观看在线看网页在线看 | 在线观看日韩毛片| 欧美国产精品一区| 蜜臀精品一区二区三区在线观看| 91免费在线播放| 久久综合久久综合九色| 天堂va蜜桃一区二区三区漫画版| voyeur盗摄精品| 久久影视一区二区| 日韩avvvv在线播放| 一本一本久久a久久精品综合麻豆| 国产性色一区二区| 久久国产精品露脸对白| 欧美精品久久一区二区三区| 亚洲视频免费看| 国产成人精品亚洲777人妖| 欧美一区二区成人| 亚洲一二三四在线观看| 色婷婷综合久久久中文一区二区 | 人人爽香蕉精品| 欧美性色黄大片| 亚洲老妇xxxxxx| 成人国产视频在线观看| 久久久久久9999| 精品亚洲成a人| 欧美大白屁股肥臀xxxxxx| 日日欢夜夜爽一区| 欧美疯狂做受xxxx富婆| 爽好多水快深点欧美视频| 久久久久久综合| 国产精品主播直播| 久久久久99精品一区| 国产成人小视频| 欧美激情一区在线| 岛国av在线一区| 亚洲欧洲在线观看av| av在线播放成人| 日韩一区欧美一区| 91香蕉视频mp4| 亚洲狠狠丁香婷婷综合久久久| 日本丶国产丶欧美色综合| 亚洲男人天堂一区| 精品视频一区二区不卡| 国产91精品一区二区| 国产日韩欧美a| 99精品在线观看视频| 亚洲精品乱码久久久久久黑人| 91免费看`日韩一区二区| 亚洲综合小说图片| 在线播放一区二区三区| 蜜臀av性久久久久蜜臀av麻豆| 亚洲精品一区二区三区99| 国产一区二区三区在线观看免费| 国产日产精品1区| 不卡一区在线观看| 亚洲国产欧美日韩另类综合| 精品视频在线免费观看| 日韩电影在线一区二区三区| 精品国产一区二区三区不卡| 国内成+人亚洲+欧美+综合在线 | 久久综合资源网| 成a人片亚洲日本久久| 亚洲激情男女视频| 日韩一区二区在线观看| 国产精品中文字幕日韩精品| 国产精品久久久一本精品 | 亚洲国产欧美在线| 欧美电影免费观看高清完整版在 | 日韩国产精品91| 精品国产免费一区二区三区香蕉| 成人avav影音| 视频一区二区三区中文字幕| 精品1区2区在线观看| www.久久精品| 蜜桃视频一区二区三区| 中文字幕av一区二区三区免费看 | 欧美激情在线免费观看| 欧美性做爰猛烈叫床潮| 国内精品国产三级国产a久久| 国产精品久久久久久久久晋中| 日本韩国一区二区三区视频| 麻豆免费看一区二区三区| 国产精品高潮久久久久无| 欧美日韩电影一区| 北岛玲一区二区三区四区| 亚洲成人你懂的| 欧美激情在线观看视频免费| 欧美乱妇23p| 成人高清视频免费观看| 美女在线观看视频一区二区| 亚洲视频综合在线| 精品99一区二区| 欧美午夜精品理论片a级按摩| 国产激情一区二区三区| 亚洲成人在线免费| 综合久久久久久久| 久久综合资源网| 欧美老肥妇做.爰bbww| 91小视频在线观看| 国产高清在线观看免费不卡|